学习本章你将了解:

Activity的生命周期与工作模式
Activity调用栈管理

8.1、Activity

系统采用activity栈的方式管理activity

8.1.2、Activity的形态

1、active/running :栈的最顶层,并与用户交互
2、paused : 被覆盖,失去了与用户交互的能力,状态、成员变量都保持着,内存不够时,会回收
3、stoped : 完全覆盖,状态、成员变量都保持着
4、killed : 回收或者从未被创建

用户的不同动作,activity会在这4种状态中切换,开发者可以控制生,但是不能控制死

8.1.3、生命周期

activity的周期状态中只有3个是稳定的,其他都是过渡状态

resumed : 也就是之前的active/running状态,处理交互
paused : 一部分被挡住,不接收用户输入
stopped : 完全覆盖,不可见,后台运行

1、启动与销毁的过程

onCreate——onStart——onResume——停在Resume状态,完成启动——调用onDestroy结束生命周期回到killed状态
onCreate :初始化UI
onPause和onStop: 清楚activity资源避免浪费
onDestroy : 线程不会在销毁的时候销毁,所以清楚开启的线程

2、暂停与恢复的过程

当activiy被遮挡,就会调用onPause方法,当结束阻塞后,就会调用onresume恢复
onPause : 释放系统资源,如:Camera,sensor,receivers
onResume : 需要重新初始化在onPause中释放的资源

3、停止与重新创建过程

当内存不足时,处于stoped状态的activity会被系统回收,此时Activity通过onSaveInstans方法保存到Bundle对象中,在onCreate中的参数恢复或者重写onrestoreInstanceState方法

8.3、AndroidMenifest启动模式

standard : 默认的
singleTop : 举个简单的例子,只有一种情况:自己跳自己,如果被覆盖,再跳进来,仍然会创建新的实例
代码如下:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
    }

    public void gotoThis(View view){
        startActivity(new Intent(this, SecondActivity.class));
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Toast.makeText(this, "onNewIntent", Toast.LENGTH_SHORT).show();
    }
}

资源文件:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="22222"
    android:id="@+id/button2"
    android:onClick="gotoThis"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="195dp"
    android:layout_marginEnd="195dp"
    android:layout_marginTop="79dp" />

1、如果在Menifest中设置singleTop

<activity android:name=".chapter8.SecondActivity" android:launchMode="singleTop"></activity>

那么结果就是没有跳转动画,执行的onNewIntent方法

2、如果不设置

那么结果就是有跳转动画,执行的onCreate方法,就像正常跳转activity一样

singleTask : 跟singleTop类似

区别是:singleTop是检查栈顶,而它是检查整个任务栈,如果任务栈中存在你想启动的activity,那么把该activity上面的所有activity都销毁,它就置于栈顶了。

singleInstance : 用于与程序分离的界面,比如调用紧急呼叫
只有一个实例,两个应用共享一个activity实例。

8.4、Intent flag启动模式

Android提供了2种方式设置启动模式,下面通过代码设置
四种常见模式:

Intent.FLAG_ACTIVITY_NEW_TASK;
用在从service启动activity的场景,因为service中没有栈,所以启动要先创建栈
Intent.FLAG_ACTIVITY_SINGLE_TOP;
同menifest中的singleTop
Intent.FLAG_ACTIVITY_CLEAR_TOP;
通menifest中的singleTask
Intent.FLAG_ACTIVITY_NO_HISTORY;
根据英文判断就是无历史的意思,用这种模式启动的activity跳转到其他页面,当前activity的finish了。
比如:A-B,B以这种模式启动C,C再启动D,当前activity栈是ABD

8.5、清空任务栈

在Menifest中的标签中使用以下属性来清理任务栈
clearTaskOnLaunch设置为true : 启动该activity的时候,压在它上面的activity全部被清除。

例如:A设置该属性
A-B,点击home,再进入,效果是B执行onRestart,onDestroy
finishOnTaskLaunch : 如果将根activity的这个属性设置为“true”,一旦其所在的任务栈切换到后台一段时间,系统会直接清除掉这个task栈中的所有activity;

alwaysRetainTaskState : 如果将根activity的这个属性设置为“true”,一旦其所在任务栈切换到后台,即便很长一段时间,系统也不会对其清理,不接收任何清理命令

8.6、Activity任务栈的使用

不可过度的使用任务栈,否则会导致栈混乱,不易维护,要根据项目的需要使用。