Android Activity的生命周期与加载模式超详细图文解析
haohulala 人气:0Activity的生命周期
Activity是安卓应用的重要组成单元之一,其对于安卓的作用类似于Servlet对于Web应用的作用。
整个Activity生命周期的图解如下
具体的生命周期可以总结成如下几个步骤
onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。
onStart():当Activity显示在屏幕上时,函数被调用。
onRestart():Activity从停止状态进入活动状态是调用。
onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。
onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。
onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。
onDestroy():在Activity被终止前,被调用。
归纳起来,Activity大概会经历四种状态
运行状态:当前Activity位于前台,用户可见,可以获得焦点
暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点
停止状态:该Activity不可见,失去焦点
销毁状态:该Activity结束,或Activity所在的进程被结束
我们使用给一个程序来看一下看一下Activity的生命周期。程序非常简单,就是定义两个Activity,分别命名为FirstActivity和SecondActivity,先从FirstActivity跳转到SecondActivity,然后再在SecondActivity销毁该Activity,最后销毁FirstActivity
public class FirstActivity extends Activity { final String TAG = "-----FirstActivity-----"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first); // 输出日志 Log.d(TAG, "-----onCreate-----"); TextView textView = findViewById(R.id.text1); Button button1 = findViewById(R.id.bn_first1); Button button2 = findViewById(R.id.bn_first2); // 第一个按钮跳转到第二个Activity button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } }); // 第二个按钮销毁该Activity button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FirstActivity.this.finish(); } }); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "-----onStart-----"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "-----onRestart-----"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "-----onResume-----"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "-----onPause-----"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "-----onStop-----"); } @Override protected void onDestroy() { super.onDestroy(); Log.v(TAG, "-----onDestory-----"); } }
public class SecondActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); Button button = findViewById(R.id.bn_second); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SecondActivity.this.finish(); } }); } }
最后得到的日志信息如下所示,我们过滤了其他日志,只保留FirstActivity的日志
Activity的加载模式
Activity一共有四种加载模式
- standard:标准模式,这是默认的加载模式
- singleTop:Task栈顶单例模式
- singleTask:Task内单例模式
- singleInstance:全局单例模式
安卓采用Task来管理多个Activity,当我们启动应用的时候,安卓就会位置创建一个Task,然后启动这个引用的入口Activity,(即<intent-filter>中配置为MAIN和LAUNCHER的Activity)。
我们可以将Task简单理解成存放Activity的栈,先加载的Activity位于栈底,后加载的Activity位于栈顶。
Activity的加载模式就是按照什么样的方式去实例化,加载Activity,并且控制Activity和Task之间的关系。
standard模式
当我们通过standard模式启动Activity的时候,每次都会创建一个新的Activity示例放置到栈顶。当我们在配置Activity时没有指定加载模式的时候,采用的就是standard模式。
singleTop模式
这种模式与standard模式基本相同,唯一不同的就是,当要启动的Activity已经位于栈顶的时候不会创建一个新的实例,而是复用已有的实例。如果我们的目标Activity不位于栈顶,那么还是会创建一个新的实例,这一点和standard模式是一样的。
singleTask模式
采用singleTask模式的Activity在同一个Task中只有一个实例,当系统采用singleTask模式启动目标Activity的时候,可分为如下三种情况
如果要启动的Activity实例不存在,系统会创建一个实例,并且将其置于栈顶
如果要启动的Activity实例位于栈顶,此时的操作与singleTop模式相同
如果要启动的Activity实例存在于栈中,但是没有位于栈顶,那么系统就会将该Activity上的所有Activity移出Task栈,从而使目标Activity转入栈顶
singleInstance模式
在这种加载模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。
当系统采用singleInstance模式启动目标Activity时,可分为如下两种情况
如果要启动的目标Activity不存在,系统会创建一个全新的Task,再创建目标Activity的实例,并将它加入到新的Task栈顶
如果要启动的目标Activity已经存在,无论它位于哪个应用程序中,位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来
加载全部内容