activity生命周期
- create -> start -> resume -> (operating) -> pause -> stop -> destroy
- 返回键:pause -> stop -> destroy
- 旋转:pause -> stop -> destroy ->(重建)create -> start -> resume
- 按下Home键然后重新打开应用: pause-> stop ; 重新启动(后台保留): restart -> start -> resume
- 用activity去启动其他的activity:先执行暂停 pause ->(create -> start -> resume) ->stop
- 用activity去启动其他的activity(已存在并且不是standard模式启动):需要启动的activity会执行onNewIntent ->resume
Q:
-
start-stop/ resume- pause 区别:
-
在 stop 阶段 已经不可见了,在onstart开始就可见了; 而在 Pause阶段是从前台到后台(无法直接交互) -
一个典型的例子是activity采用透明主题:回退时不会执行stop,因为仍可见;又例如在一个activity里打开另一个activity但是没完全覆盖,则不会执行stop -
透明主题的使用:在manifest中直接指定主题:android:theme="@android:style/Theme.Translucent.NoTitleBar" ;遇到的错误:AppcompaActivity相比activity:theme主题只能用android:theme=”@style/AppTheme (appTheme主题或者其子类),而不能用android:style -
不同生命周期的任务:
- create: 指定 XML 布局文件;定义成员变量(初始化控件);数据恢复(savedInstance).此时布局view还未建立
- resume:Activity已在在屏幕上显示UI并允许用户操作.打开相机或开启动画;注册动态广播
- pause:关闭独占设备camera,关闭动画 (这也是为什么前面第5点暂停执行的原因);解绑动态广播;临时存储希望保存的数据,不能处理耗时操作
- stop: 适合cup-intensive的关闭操作,适合处理heavy-load的task:例如数据库的写入
- restart:一般不做什么
启动模式
- 通过launchMode静态指定:
- 特别注意的是 singleTask ,它会先去寻找自己的栈是否存在:如果不存在直接创建,如果存在,查找是否栈内有这个activity,若有,弹出其上面的activity,然后调用这个activity的NewIntent. 自己栈是由 TaskAffinity 指定,默认情况下为包名
- 用flags设定启动模式/影响activity运行状态
- FLAG_ACTIVITY_CLEAR_TOP, 当 activity 为standard时, 连同它本身出栈,重新create,否则效果和singleTask相同.
- FLAG_ACTIVITY_NO_HISTORY 不会放入回退栈
- 特殊属性 allowTaskReparenting:(更改父项)
- 一种场景两个应用A,B,在A中启动B的一个activity b(b的启动方式为standard/singleTop),此时,虽然TaskAffinity不同,但是启动的b在A的栈中,当我们启动B应用时,不会看到B的home,系统发现b的任务栈被创建了,将b放到的B的栈顶,因此看到的是b.这个场景的现实例子是,我在微信里打开微博的连接,跳转到微博的一个activity,当我再打开微博时,还是这个activity
- 不同的启动方式实际应用(这一块需要补充):
- singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面
- singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离
- singleTop 通知打开页
- 不是很熟悉 一些参考1 一些参考2
Intent
-
Intent数据传递:
- 基础数据结构可以直接通过putExtra,get…Extra得到
- 自定义则通过实现Serializable接口传递对象,另一种是通过实现Parcelable接口传递对象,android 中优先选择parcelable
- 选择:Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;而Parcelable不能使用在要将数据存储在磁盘上的情况
- Bundle 会对
intent.putExtra("media_id", "a1b2c3") 打包:=> Bunle b=new Bundle() b.put...("","") ,让对象序列化就是让对象能够被打包形成键值对的形式 -
Intent-filter匹配规则:
-
action: 每个Intent有且仅有一个action,与过滤器的其中一个匹配即可 -
category:可以有多个,多个需与过滤器完全匹配 -
data:
-
URI: 是一种结构规范:我们可以提取结构的相应部分 很不错的文章 :
?#
其中为@: -
mimeType:媒体类型,有image/jpeg,video/*,text/plain -
设置: setDataAndType("","") -
判断是否有匹配的intent,防止崩溃: intent.resolveActivity(packageManager)!=null
异常旋转销毁
- 系统配置改变,会调用回调SaveInstanceState在stop()前,收集到的bundle可以传递给oncreate和onRestoreInstance,这个在start后调用
- 不想要旋转发生变化:指定
android:configuration=“orientation|screensize” ,上述的回调不会调用,转而调用onConfigurationChanged回调
Android 面试黑洞——当我按下 Home 键再切回来,会发生什么
|