Context概念
Context是一个抽象类,日常用的的具体实现有:Activity,Service,Application,占据了四大组件的三个<br>
Context:上下文,代表与操作系统交互的一种过程,Android在用户行为的过程中都需要Context参与,成为一个连通整个操作流程的媒介
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 启动模式
模式 | 说明 |
---|---|
“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 启动方式
startService()
或startForegroundService()
,onBind()
方法可返回null,
调用的生命周期: onCreate –> onStartCommand(可多次调用) –> onDestroybindService
,onBind()
方法需要返回一个IBinder的不可空对象。绑定到服务必须提供ServiceConnection
的实现
调用的生命周期: onCreate()->onBind()->Service running–>onUnbind() -> onDestroy()