您的位置:首页 > 其它

Activity和Service的启动

2016-03-07 19:13 239 查看
activity启动(通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。)

相同app:

standard:新启动的activity位于栈顶;当我们用ApplicationContext去启动activity的时候会报错,因为该activity会默认进入启动它的activity所在的栈,非Activity类型的context没有对应的任务栈,可以加一个FLAG_ACTIVITY_NEW_TASK标记位,此时实际上以singleTask模式启动的。

singleTop:如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent()方法,onResume()方法。(类似于FLAG_ACTIVITY_SINGLE_TOP效果)

singleTask:如果实例存在所有位于该activity上面的activity实例会被销毁,调用onNewIntent(),onResume();如果新启动的activity在另一个栈,整个后台任务栈会移到前台,前台移动到后台,自带FLAG_ACTIVITY_CLEAR_TOP效果。(类似于FLAG_ACTIVITY_NEW_TASK效果)

singleInstance:新启动的activity独占一个栈,它启动的activity也会放于其他栈中,

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()的时候,它会来处理这个请求,然后调用其它的人来具体做事。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: