Android五大组件-Activity

Activity生命周期

Activity生命周期图
这是Android api中所提供的Activity生命周期图,此外Activity还有四种状态:
- running:Activity处于栈顶,接收输入事件
- paused:Activity失去焦点(即Activity不处于栈顶但可见,不接收事件)。一种情况是其被非全屏的Activity占据(eg:Dialog弹框)再或者被透明的Activity占据。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- stoped:Activity完全被覆盖。正常此时Activity所有成员变量,内存状态都还在(除非内存紧张)
- killed:被系统回收掉,此时Activity所有成员变量,内存状态都不存在了
下面是Activity几个生命周期的几个关键方法
- onCreate():此时Activity尚不可见,根据setContentView读取根视图之后…
- onStart():此时Activity可见但还不能接收输入事件
- onResume():此时Activity可见且可接收输入事件
下面是Activity的几个常见场景的生命周期流转:
- 点击Home键:running->onPause->onStop
- 回到Activity:stoped->onRestart->onStart->onResume
- 退出Activity:running->onPause->onStop->onDestroy
- 横竖屏切换:(正常情况下,Activity会被销毁并重新创建)running->onPause->onStop->onDestroy->onCreate->onStart->onResume
- 锁屏、解锁屏:(正常情况下)锁屏onPause->onStop 解锁屏onRestart->onStart->onResume

横竖屏相关参数:

  • android:screenOrientation:
    “unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
    “landscape”:横屏显示(宽比高要长)
    “portrait”:竖屏显示(高比宽要长)
    “user”:用户当前首选的方向
    “behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
    “sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
    “nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了
  • android:configChanges=”orientation|screenSize”。设置该属性横竖屏切换时Activity不会销毁重建,会调用onConfigurationChanged让我们可以做布局切换等工作

Activity启动模式

  • standard:每次启动Activity都会创建Activity实例
  • singletop:当启动的Activity与栈顶Acitivity相同则不会创建新的Activity实例
  • singletask:当Activity栈中有相同的Activity,则将Activity之上的其他Activity出栈使其位于栈顶
  • singleinstance:独立一个Activity任务栈

Activity任务栈

正常情况下,一个应用只有一个进程,而一个进程只有一个Activity栈

Intent Filter

https://blog.csdn.net/mynameishuangshuai/article/details/51673273

隐式启动:隐式启动会根据条件匹配所有合适的对象以供选择
隐式启动需要在AndroidManifet.xml中设置Activity接收的intent-filter条件;然后startActivity的Intent中设置查找筛选条件

<!-- AndroidManifet.xml中 配置Acitivity条件-->
<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.DIAL"/>
        <data android:scheme="tel"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
//筛选条件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);

配置Acitivity的intent-fliter
intent-fliter有三种属性(action、data、category);action表示意图,查找的时候需要要有一个action匹配即可;category表示动作类别,需要全部匹配方可;data表示与动作要操纵的数据,匹配一组即可。

其中data有一下四种类型:

  • android:scheme 用于指定数据的协议部分,如上例中的http部分
  • android:host 用于指定数据的主机名部分,如www.baidu.com部分
  • android:port 用于指定主机名和端口之后的部分,一般紧随在主机名之后
  • android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定

Activity(杂)

  • onSaveInstanceState/onRestoreInstanceState:Activity很有可能被系统销毁的时候调用,用户点击back键或者主动销毁不调用。可以存储和恢复相关数据

Activity启动过程

这里假设从Launcher启动一个全新的App,整个启动过程主要关系到三个进程:Launcher,AMS,新启动的App进程
下面是一个简化的过程
Activity启动过程简述
下面是一个较为详细的过程图(从system_server启动Launcher画起)
这里写图片描述
附上原文件(用亿图打开)

  • 当此Activity的实例已经存在,并且此时的启动模式为SingleTask和SingleInstance,另外当这个实例位于栈顶且启动模式为SingleTop时也会触发onNewInstent(),而不触发onCreate
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值