Android Activity的生命周期与加载模式超详细图文解析
作者:haohulala
Activity的生命周期
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显示出来
到此这篇关于Android Activity的生命周期与加载模式超详细图文解析的文章就介绍到这了,更多相关Android Activity的生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!