关于Activity和Service

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生命周期

关于Activity和Service_第1张图片



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。

  1. 创建一个HandlerThread,即创建了一个包含Looper的线程。

    HandlerThread handlerThread = new HandlerThread("leochin.com");

    handlerThread.start(); //创建HandlerThread后一定要记得start()

  2. 获取HandlerThread的Looper

    Looper looper = handlerThread.getLooper();

  3. 创建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()的时候,它会来处理这个请求,然后调用其它的人来具体做事。





你可能感兴趣的:(关于Activity和Service)