一、Activity生命周期
1.activity的四种状态
(1)Running
当一个活动位于返回栈的栈顶的时候,此时Activity就处于Running状态
(2)Paused
当一个Activity不再处于栈顶却依然可见的时候,这个时候,就进行了Pause状态。因为并不是每个Activity都占满整个屏幕,如果新的Activity是以对话框的形式仅仅占用屏幕的中间位置,那么之前的Activity就处于Pause状态。
(3)Stopped
当一个Activity不再处于栈顶,并且不可见的时候,进进入了Stop状态。系统仍然会为其保存相应的状态和变量,但是当需要回收内存的时候,处于Stop状态的Activity可能会被回收。
(4)Killed
当一个Activity从返回栈移除的时候,其就变成了Killed状态。
2.activity的生命周期
(1)onCreate() 在Activity第一个被创建的时候调用
(2)onStart() 在Activity由不可见变成可见时被调用
(3)onResume() 在Activity准备好和用户进行交互的时候被调用。此时Activity处于返回栈的栈顶,并且处于运行状态。
(4)onPause() 在系统准备启动或者恢复另一个Activity的时候被调用。
(5)onStop() 在Activity完全不可见时被调用。
(6)onDestroy() 在Activity被销毁之前调用,之后的Activity变为销毁状态。
(7)onRestart() 在Activity由Stop转变为Running状态之前调用。
除去onRestart()方法之外,其他的都可以看作是两两对应的:
(1)完整生存期:在onCreate()和onDestroy()方法之间经历的,就是完整生存期。一般在onCreate()中完成各种初始化操作,在onDestroy完成内存释放的操作。
(2)可见 生存期:在onStart()和onStop()之间所经历的,就是可见生存期。
(3)前台生存期 Activity在onResume()方法和onPause()方法之间所经历的就是前台生存期。
Activity启动的时候: onCreate() -> onstart() ->onResume
按下home键,返回桌面的时候:oPause()->onStop()
返回到前一个页面的时候:onRestart(0->onStart()->onResume
退出当前页面的时候:onPause()->onStop()->onDestroy()
3.android进程优先级
前台/可见/服务/后台/空
(1)前台进程:即与用户正在交互的Activity或者Activity用到的Service等,如果 出现系统内存 不足的时候前台 进程是最后被杀死的。
(2)可见进程:可以是处于暂停状态(onPause)的Activity或者是绑定在该Activity上的Service,即被用户可见,但是由于失去了焦点 而不能与用户交互。
(3)服务进程:其中运行着使用startService方法启动的Service,虽然不被用户看见,但是却是用户关心的,例如用户正在非音乐 界面听的音乐或者正在非下载页面自己下载的文件等;当系统需要 空间运行前台 进程和可见进程的时候才会被终止。
(4)后台进程:其中运行着执行onStop方法而停止的程序,但是却不是用户最关心的,例如后台 挂着的QQ,这样的进程系统一旦没了内存就首先被杀死。(平常手机定时清理的就是后台进程)
(5)空进程:不包含任何应用程序的程序组件的进程,这样的 进程系统一般不会让其 存在,为了进行缓存,使下次App启动的时候更快,当系统需要内存的时候最先被杀死。
Android中如何避免后台进程被杀死?
1.调用startForegound,让Service所在的进程成为前台进程。
2.Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT
3.Service的onDestroy里面重新启动自己
二、android任务栈
1.一个应用程序一般都是由多个activity组成的。任务栈(task stack)(别名back stack后退栈) 记录存放用户开启的activity的。
2.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。
3.任务栈的id是一个integer的数据类型 自增长的。
4.在android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。
5.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。
6.默认情况下, 关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。
三、activity启动模式
1.standard 标准模式
标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动时候的生命周期(onCreate()->onStart()->onResume())都会执行。(这样也就是说,任务栈中可能有超过两个一样的Activity。)
2.singleTop 栈顶复用模式
这种模式下,如果新Activity已经位于任务栈 的栈顶,那么此Activity不会被重新创建,所以它的启动时候的生命周期(onCreate()->onStart()->onResume())不会被执行,同时Activity的onNewIntent()方法会被回调;如果Activity已经存在但是它却不在栈顶,那么此时singleTop的作用和standard一样。
3.singleTask 栈内复用模式
创建这样的Activity的 时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈,然后放入Activity,如果栈 中已经有一个Activity实例,那么这个Activity就会被调用到栈顶,并回调onNewIntent(),并且singleTask会清理在当前Activity上面所有的Activity。(→_→很强)
4.singleInstance 加强版本的singleTask模式
这种模式的Activity只能单独位于一个任务栈中,由于栈内复用的 特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。
注:Activity的堆栈管理 以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面,可以认为一个ActivityRecord就是一个Activity栈。
四、Scheme跳转协议
1.什么是URL Scheme?
android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
2.URL Scheme的应用场景?
客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:
* 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
* H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
* APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
* APP根据URL跳转到另外一个APP指定页面
3.URL Scheme的格式
客户端自定义的 URL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。这跟我们常见的网页内容 URL 格式一样。一个普通的 URL 分为几个部分,scheme、host、relativePath、query。
看一个完整的URL Scheme协议格式:
xl://goods:8888/goodsDetail?goodsId=10011002
URL的几个部分在这个路径中全部被包括:
* xl代表该Scheme 协议名称
* goods代表Scheme作用于哪个地址域
* goodsDetail代表Scheme指定的页面
* goodsId代表传递的参数
* 8888代表该路径的端口号
4.Scheme定义Activity
待续。。。。。。