Activity和Service的启动

来源:互联网 发布:奥凯航空的航线网络 编辑:程序博客网 时间:2024/05/16 15:01

activity启动(通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。)

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

singleTop:如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent()方法,onResume()方法并且在onNewIntent中setIntent,来更新最新的intent;此外当系统内存不够会随时杀死后台的activity,这样就会调用onCreate(类似于FLAG_ACTIVITY_SINGLE_TOP效果

singleTask:如果实例存在所有位于该activity上面的activity实例会被销毁,调用onNewIntent(),onResume();如果该activity处于onPause,onStop状态,则是onNewIntent,onRestart,onStart,onResume,并且在onNewIntent中setIntent,来更新最新的intent;此外当系统内存不够会随时杀死后台的activity,这样就会调用onCreate;如果新启动的activity在另一个栈,整个后台任务栈会移到前台,前台移动到后台,自带FLAG_ACTIVITY_CLEAR_TOP效果。(类似于FLAG_ACTIVITY_NEW_TASK效果)

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


用startActivityForResult启动singleTask和singleInstance启动模式的activity,系统会直接返回Activity.RESULT_CANCELED而不会等待返回,因为Android认为不同的task之间是不能传递数据的,如果要传递需要用intent传递




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。

  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, 实现了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来完成整个启动过程
b.    它是Activity客户端的管理类,由它来决定,什么时候调用onCreate(),什么时候调用onResume()方法。当Activity发起一个请求时,比如startActivity(),或者finish()的时候,它会来处理这个请求,然后调用其它的组件来具体做事。





1 0