《Android开发艺术探索》Activity生命周期和启动模式浅读

一、Activity生命周期

 1. 完整生命周期:onCreate()→onStart()→onResume()→onPause()→onStop()→onDestroy()

  onCreate:界面被创建的时候调用,可以进行一些资源的初始化。

  onStart:界面已经可见,但是还未到前台。

  onResume:界面已经处于前台,用户可见状态。

  onPause:界面部分被遮挡,处于后台,该回调不能做过多数据处理。

  onStop:界面完全不可见。

  onDestroy:界面被销毁,回收和释放资源。

 onRestart:界面处于后台不可见时,当重新进入该界面会时调用此方法后执行onResume而不是onStart。

 注:当A界面跳转到B界面时,先执行A界面的onPause,然后执行B界面onCreate→onStart→onResume,最后执行A界面的onStop。

Activity启动过程:启动activity的请求会由Instrumentation处理,通过Binder向ActivityManagerService(AMS)发送请求,AMS通过ActivityThread同步activity状态完成生命周期调用。

2.异常状态下生命周期

资源配置改变导致activity重新创建(横竖屏切换):

当手机屏幕切换时,导致布局尺寸发生改变引起资源重新加载,此时activity会被重新创建,activity会掉用onSaveInstanceState方法,该方法和onPuse无固定顺序但一定在onStop之前调用,重新创建后可从onCreate方法或者onRestoreInstanceState方法的Bundle参数中获取数据,官方建议从onRestoreInstanceState获取,且onRestoreInstanceState会在onStart之后调用。

每个界面视图view和activity有一样保存数据的相同机制,activity保存数据时会委托Window,Window再向上层顶级容器委托保存,容器在通知他的每一个子视图保存数据(子视图会选择性的保护恢复一些数据)

注:如果不想因为界面变化导致activity重新创建的话,可以在配置文件设置activity的configChanges属性(orientation屏幕切换、keyboardHidden软键盘调出等)。

内存不足导致低优先级的activity被杀掉:

优先级排序:用户可交互(完全可见)>部分被遮挡(弹出对话框的时候)>完全不可见(后台界面)

 注:代码中每一个操作尽量依附在四大组件中,脱离组件很容易使进程被杀死导致数据丢失,所以后台数据要尽可能放在Service中执行。

二、Activity启动模式

1.activity加载模式

standard(系统默认):无论当前activity是否已经在存在所要启动任务栈中,均会创建一个新的。

singleTop(栈顶复用):如果当前activity已经在存在所要启动任务栈的栈顶,则不会再创建,如果activity已存在栈内且不是栈顶位置则该activity之上的activity均会出栈,最后都会回调onNewintent方法再调用onResume方法。

singleTask(栈内复用):如果当前activity已经在存在所要启动任务栈中,则不会再创建,且会回调onNewintent方法再调用onResume方法。

singleInstace(单独栈):会为activity开辟已个新的栈来进行创建。

注:activity被创建时系统会将他分配到启动它的activity到同一任务栈中,如果想通过context启动显示启动时需指定FLAG_ACTIVITY_NEW_TASK标记为他创建新的任务栈,如不指定会导致context则会导致无法从中找到任务栈出现错误。

activty中的TaskAffinity可以指定创建时所在任务栈名称,当activty配置了TaskAffinity和allowTaskReparenting属性时,当allowTaskReparenting为true时标志该activity可以被转移任务栈。

2.Activity中的Flags

FLAG_ACTIVITY_NEW_TASK(类似于singleTask)、FLAG_ACTIVITY_SINGLE_TOP(类似于singleTop)、FLAG_ACTIVITY_CLEAR_TOP(类似于singleTop,不过当启动模式设置为standard时该activity会被重新创建)。

3.Activity隐式启动(匹配IntentFilter)

action匹配规则:一个activty可以设置多个action,当要隐式启动该activity时,至少要有一个action能匹配上才能启动。

category匹配规则:一个activty可以设置多个category,当要隐式启动该activity时,可以没有category,但是得category需设置android.intent.category.DEFAULT熟悉,如果不设置category系统会默认添加该属性。

data匹配规则:activity中的data可以由scheme(URI的模式)、host(URI的主机名)、port(URI的端口号)、path(完整的路径信息);pathPattern(完整的路径信息,可用通配符*);pathPrefix(路径前缀信息)。

注:如果隐式启动activity不符合规则则会导致启动出错,启动前可先通过intent的resolveActivty方法或者packageManager的queryIntentActivity判断是否为null,前者返回的为最佳匹配的Activity,后者为所有成功匹配的Activity。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值