activity启动(通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。)
相同app:
standard:新启动的activity位于栈顶
singleTop:如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。
singleTask:如果实例存在所有位于该activity上面的activity实例会被销毁
singleInstance:新启动的activity独占一个栈,它启动的activity也会放于其他栈中
不同app:
standard:新启动的activity位于栈顶
singleTop:intent有Inten.FLAG_ACTIVITY_NEW_TASK标记,后端任务会移动到前端,前端移到后端,没有就在前端任务栈顶创建新的activity
singleTask:后台任务移到前台,前台移到后台
singleInstance:前台还是在前台,后台还是在后台,如果已有该实例,会调用该activity的onNewIntent方法
singleTask和singleInstance会自动在intent中添加new Task标记,也就不能通过startActivityForResult方法回调返回值
Service分类:
按照使用范围:本地服务,远程服务;按照运行类别:前台服务和后台服务
Service生命周期
IntentService流程:onCreate()(handlerThread创建一个looper,创建handler和handerThread的looper绑定)——onStartCommand()———子线程中创建的handler.sendMessage——handler.handleMessage(onHandelIntent+stopSelf(int startId))——onDestroy(looper.quit,终止消息循环)
stopself()会立刻停止服务,stopSelf(int startId)在尝试停服务前,会判断最近启动服务的次数是否和startId相等,相等说明已经执行完最后一个任务,停止服务,否则不停止服务
handler.obtainMessage()比new Message()要好,obtainMessage()是从消息池拿来一个msg循环利用,不需要另开辟空间new,new 需要重新申请,效率低
startService和stopService定义在Context中,stopSelf可以在Service中的任何一个位置调用
尽管HandlerThread
的文档比较简单,但是它的使用并没有想象的那么easy。
创建一个HandlerThread
,即创建了一个包含Looper的线程。
HandlerThread handlerThread = new HandlerThread("leochin.com");
handlerThread.start(); //创建HandlerThread后一定要记得start()
获取HandlerThread
的Looper
Looper looper = handlerThread.getLooper();
创建Handler,通过Looper初始化
Handler handler = new Handler(looper);
通过以上三步我们就成功创建HandlerThread
。通过handler发送消息,就会在子线程中执行。
如果想让HandlerThread
退出,则需要调用handlerThread.quit();
。
1. AMS --- ActivityManagerService.java, android系统服务,Activity管理的服务端,用于管理activity的各种行为,控制activity的生命周期,派发消息事件,低内存管理等等。实现了IBinder接口,可以用于进程间通信,管理四大组件。
2. ApplicationThread.java, 实现了IBinder接口,activity整个框架中客户端和服务端(Ams)通信的接口。同时也是类ActivityThread的内部类。这样就有效地把Ams和ActivityThread绑在了一起。
3. ActivityThread.java,如第2点所述,ApplicationThread所绑定的客户端就是ActivityThread。ActivityThread这个类在Activity客户端非常重要。
a. 它是应用程序的入口,众所周知,java程序的入口时main()方法,同样,当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程,同时启动一个主线程的时候,主线程就从ActivityThread.main方法开始执行,它会初始化一些对象,调用performLaunchActivity来完成整个启动过程,这个方法内部会通过类加载器创建activity的实例对象,然后自己进入消息等待队列, 也就是Looper.loop(); 一旦进入loop()方法,线程就进入了死循环,再也不会退出;一直在等待别人给他消息,然后执行这个消息。这也是edt(事件驱动模型)的原理。
b. 它是Activity客户端的管理类,由它来决定,什么时候调用onCreate(),什么时候调用onResume()方法。当Activity发起一个请求时,比如startActivity(),或者finish()的时候,它会来处理这个请求,然后调用其它的人来具体做事。