activity生命周期(这篇足够了)

activity生命周期(这篇足够了)

前言

Activity是安卓提供给用户与手机之间可交互的界面组件,也是四大组件中比较重要的组件。那么?
Activity从创建到销毁过程是怎么样的呢?

在这里插入图片描述
我们从以下几个知识点做分析:

  • Activity五个状态
  • Activity的生命周期
  • Activity横竖屏生命周期
  • Activity四种启动方式
  • Activity问题总结

Activity五个状态

Starting-> running-> poused-> stopped-> killed

关于activity四个状态所在的生命周期:

4个的状态

  • 启动状态(Starting):Activity的启动状态很短暂,当Activity启动后便会进入运行状态(Running)。
  • 运行状态(Running):Activity在此状态时处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互。如单击、长按等事件。即使出现内存不足的情况,Android也会先销毁栈底的Activity,来确保当前的Activity正常运行。
  • 暂停状态(Paused):在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有没有响应,此时它处于暂停状态。
  • 停止状态(Stopped):当Activity完全不可见时,它处于停止状态,但仍然保留着当前的状态和成员信息。如系统内存不足,那么这种状态下的Activity很容易被销毁。
  • 销毁状态(Destroyed):当Activity处于销毁状态时,将被清理出内存。

注:还有一种情况由于系统内存不足可能在Paused状态中直接被系统杀死达到killed状态。

activity的生命周期

oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()
在这里插入图片描述

上面图概括了android生命周期的各个环节,描述了activity从生成到销毁的过程。

  • onCreate() : 在Activity创建时调用,通常做一些初始化设置;
  • onStart(): 在Activity即将可见时调用;
  • onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
  • onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
  • onStop() : 在Activity对用户不可见时调用;
  • onDestroy() :在Activity销毁时调用;
  • onRestart() : 在Activity从停止状态再次启动时调用;

Activity横竖屏生命周期

横竖屏切换涉及到的是Activity的android:configChanges属性;
android:configChanges可以设置的属性值有:

  • orientation:消除横竖屏的影响
  • keyboardHidden:消除键盘的影响
  • screenSize:消除屏幕大小的影响
public class MainActivity extends AppCompatActivity {
public static final String TAG=MainActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG,"onCreate");
    setContentView(R.layout.activity_main);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i(TAG,"onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i(TAG,"onResume.........");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i(TAG,"onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i(TAG,"onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i(TAG,"onDestroy");
}

运行Activity,生命周期如下:
在这里插入图片描述
切换横屏,生命周期如下:
在这里插入图片描述
再切回竖屏,生命周期如下:
在这里插入图片描述
修改AndroidManifest.xml,添加android:configChanges="orientation"并切换横屏,生命周期如下:
在这里插入图片描述
再切换竖屏,生命周期如下:
在这里插入图片描述
修改AndroidManifest.xml,属性改为android:configChanges=“orientation|keyboardHidden|screenSize”,切换横屏,生命周期如下:
在这里插入图片描述
再切换回竖屏,生命周期如下:
在这里插入图片描述

结论

设置Activity的android:configChanges属性为orientation或者orientation|keyboardHidden或者不设置这个属性的时候,横竖屏切换会重新调用各个生命周期方法,切横屏时会执行1次,切竖屏时会执行1次;
设置Activity的属性为android:configChanges="orientation|keyboardHidden|screenSize"时,横竖屏切换不会重新调用各个生命周期方法,只会执行onConfigurationChanged方法;

Activity四种启动方式

一个项目中会包含多个activity,系统中使用任务栈来存储这些activity,任务栈呢,是一种“后进先出”的栈结构。举个栗子:当我们多次启动同一个(没有设置启动方式–即默认的启动方式)的activity的时候,系统会创建多个实例依次进入栈中。当back返回的时候,每按一次,一个activity出栈。直至栈空为止。

在这里插入图片描述

Standard 标准模式

无论任务栈内是否已经存在要启动的Activity实列,都会创建一个Activity放入任务栈,并置于栈顶。
使用场景:默认使用大多数场景

SingleTop栈顶复用模式

如果任务栈已经存在一个要启动的Activity实列,就复用该Activity置于栈顶不会重新创建Activity的实列,复用Activity会执行onNewIntent方法,但是onCreate.onStart方法不会执行,因为它没有改变.如果任务栈中或者任务栈顶没有实例就创建一个Activity实例存入其中,置于栈顶。
使用场景:适合接收通知内容显示页面,当用户从任务栏中进入查看消息内容界面时,如果设置为singleTop时,这样每次行为都使用同一个实例,用户点击返回时不会存在多个消息页面的情况。

SingleTask栈内复用模式

如果栈内已经存在要启动的Activity实例,就把该Activity栈上面的activity清出栈,让该activity置于栈顶,如果复用它的onNewIntent方法会被回调,但是onCreate.onStart方法不会执行,因为它没有改变.
使用场景:APP的首页,当你需要到某个页面时,关闭之前所打开的Activity可以用到。

SingleInstance单实例模式

这种模式启动的Activity实例单独占用一个任务栈,也就是启动该模式的Activity同时给它分配一个任务栈。
使用场景:singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

使用方式

<!-- 属性 
standard:标准模式 
singleTop:栈顶复用模式 
singleTask:栈内复用模式 
singleInstance:单例模式 
如不设置,Activity的启动模式默认为标准模式(standard)-->
<activity android:launchMode="standard" 
</activity> 

或者

/**
 *  FLAG_ACTIVITY_SINGLE_TOP:指定启动模式为栈顶复用模式(SingleTop)
 *  FLAG_ACTIVITY_NEW_TASK:指定启动模式为栈内复用模式(SingleTask)
 *  FLAG_ACTIVITY_CLEAR_TOP:所有位于其上层的Activity都要移除,SingleTask模式默认具有此标记效果;
 *  FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上;
 */
Intent inten = new Intent (ActivityA.this,ActivityB.class); 
intent.addFlags(Intent,FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

参考:

android开发者-Activity

  • 102
    点赞
  • 535
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值