开发艺术探索--Activity生命周期和启动模式

第一章: Activity生命周期和启动模式

本章包括: 声明周期,启动模式及IntentFilter的匹配规则.

生命周期
启动模式
IntentFilter

生命周期

典型情况下: 用户参与下,生命周期的改变
异常情况下: 被系统回收或者Configuration改变重建

  • 典型情况下
    1. 当用户按下Home后回来:onPause -> onStop -> onRestart -> onStart ->onResume.
    2. onStartonResumeActivity已经可见,`onStart还在后台,onResume在前台.
    3. onPause:保存数据,停止动画等工作,但不能太耗时.因为执行完才会打开新的Activity
    4. onStop: 稍微重量级的回收工作,也不能太耗时.
    5. 如果Activity采用了透明主题,那么不会回调onStop.
    6. onStart与onStop对应Activity是否可见,onResume与onPause对应Activity是否在前台(多次调用).
    7. onPause执行完后新的Activity的onResume才会执行.见ActivityStack#resumeTopActivityInnerLocked
    8. ApplicationThread#scheduleLaunchActivity回调Activity的声明周期方法.
  • 异常情况下
    1. onSavedInstanceState在onStop之前调用,和onPause没有既定时序关系.
    2. onRestoreInstanceState在onStart之后调用.需要在onCreate中进行判空处理.
    3. View状态保存和恢复采用了委托的思想.Activity->Window->ViewGroup
    4. 如果一个进程中没有四大组件执行,资源不足会很快被系统杀死,比较好的做法是将后台工作放到Service中进行
    5. "android:configChanges="orientation|screenSize":避免屏幕旋转时Activity重建,这时候只会回调onConfigurationChanged.
    6. configChanges相关含义:activity

启动模式及Flags

  1. Activity的四大启动模式,之前的总结 Activity任务栈及启动模式
  2. adb shell dumpsys activity: 获取activity堆栈信息.

IntentFliter

  1. 一个Activity可以有多个IntentFilter,只要能匹配任何一组即可成功启动对应Activity
  2. action : 有其一匹配即可,

    1. action是一个字符串,区分大小写。
    2. Intent中必须有一个action,且必须能够和过滤规则中的某个action相同
  3. category : 可以没有,有则必有其一匹配.

    1. 可以没有 category,系统会默认加上 android.intent.category.DEFAULT
    2. 一旦有 category,不管有几个,每个都要和过滤规则中的 任何一个 category 相同。
    3. 为了activity 能够接受隐式调用,最好加上android.intent.category.DEFAULT这个category.
  4. data : 必须有一个完全匹配,

    1. datamimeTypeURI组成,其中URI包括:scheme,host,port,path.
    2. 如果data只有mimeType而没有指定URI,则URI默认值是content和file
    3. data中的setDatasetType冲突,需使用setDataAndType
    • 隐式调用前最好使用resolveActivity来判空(加上MATCH_DEFAULT_ONLY)
    • 系统建议使用显示的方式来启动服务.
    • Intent-fliter 的匹配规则对于 ServiceBroadcastReceiver 也是同样的道理。
public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
            @ResolveInfoFlags int flags);

public abstract ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags);

这两个方法,需要注意后一个参数 ,需要用MATCH_DEFAULT_ONLY来匹配android.intent.category.DEFAULT这个category.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值