0%

Context及其子类的分析

Context概念

Context是一个抽象类,日常用的的具体实现有:Activity,Service,Application,占据了四大组件的三个<br>
Context:上下文,代表与操作系统交互的一种过程,Android在用户行为的过程中都需要Context参与,成为一个连通整个操作流程的媒介

content

ContextWrapper Context的装饰模式

内部的mBase是实际实现者,避免代码重复,版本兼容,根据传入者的具体类进入调用<br>
一般mBase 是通过 初始化或者#attachBaseContext实现赋值<br>
View#getContext 方法有可能返回ContextWrapper,Application,Activity
Application Activity Service ContentProvider BroadcastReceiver
Show a Dialog No YES NO NO NO
Start an Activity NO1 YES NO1 NO1 NO1
Layout Inflation NO2 YES NO2 NO2 NO2
Start a Service YES YES YES YES YES
Bind to a Service YES YES YES YES NO
Send a Broadcast YES YES YES YES YES
Register BroadcastReceiver YES YES YES YES YES
Load Resource Values YES YES YES YES YES

NO1 表示Application context的确可以启动Activity,但是它需要创建一个新任务,并产生一个不标准的回退栈(back stack),通常不推荐这样做。
NO2 表示这是非法的,但是这个填充(inflation)的确可以完成,但是是使用所运行的系统默认的主题(theme),而不是你app定义的主题。
NO3 在Android4.2以上,如果Receiver是null的话(这是用来获取一个sticky broadcast的当前值的),这是允许的。

Application 应用程序,app有且只有一个,生命周期即App的生命周期

Activity 应用程序的活动组件

Activity提供一个可供用户操作的可视化界面,存在自己的一套生命周期,通过"堆栈"的形式进行新建、显示、隐藏、销毁

Activity 生命周期

activity_lifecycle

Activity 启动模式

模式 说明
“standard” (默认模式) 默认。系统在启动它的任务中创建Activity的新实例,并将意图路由到该实例。Activity可以多次实例化,每个实例可以属于不同的任务,一个任务可以有多个实例。
“singleTop” 如果Activity的实例已存在于当前任务的顶部,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建Activity的新实例。Activity可以多次实例化,每个实例可以属于不同的任务,一个任务可以有多个实例(但只有当后端堆栈顶部的Activity不是Activity的现有实例时)。
“singleTask” 系统创建新任务并在新任务的根目录下实例化Activity。但是,如果Activity的实例已存在于单独的任务中,则系统会通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。一次只能存在一个Activity实例。
“singleInstance” 相同”singleTask”,区别在于:系统不启动任何其他Activity纳入控制实例的任务。Activity始终是其任务的唯一成员; 任何由此开始的Activity都在一个单独的任务中打开。

taskAffinity 属性

taskAffinity 是在xml注册Activity时的属性,默认情况是Activity启动是放入与App包名相同的栈中,如果设置了android:taskAffinity 则会推入与taskAffinity相同的栈中,如果没有这个Activity栈则会创建一个<br>
taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义

Intent flags 跳转意图

当进行Activity跳转时,可设置跳转意图,实现Activity与启动模式相同的效果
模式 说明
FLAG_ACTIVITY_NEW_TASK 与上述”singleTask” 效果相同
FLAG_ACTIVITY_SINGLE_TOP 与上述”singleTop”效果相同
FLAG_ACTIVITY_CLEAR_TOP 如果正在启动的Activity已在当前任务中运行,则不会启动该Activity的新实例,而是销毁其上的所有其他Activitys,并将此意图传递给Activity的恢复实例

Service 不可见服务

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件<br>
官网说可以在此执行耗时操作,实际发现 Service 是在ActivityThread 线程,执行耗时操作会导致 ANR ,耗时操作需要新建线程

Service 生命周期

service_livecycle

Service 启动方式

  1. startService()startForegroundService()onBind()方法可返回null,

    调用的生命周期: onCreate –> onStartCommand(可多次调用) –> onDestroy
  2. bindServiceonBind()方法需要返回一个IBinder的不可空对象。绑定到服务必须提供 ServiceConnection 的实现

    调用的生命周期: onCreate()->onBind()->Service running–>onUnbind() -> onDestroy()