Activity和Service的启动

本文详细介绍了Android中Activity的不同启动模式及其应用场景,包括standard、singleTop、singleTask和singleInstance的特点与区别。同时,还深入探讨了Service的分类、生命周期以及IntentService的工作流程。

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





### ActivityManagerService启动流程解析 #### 初始化阶段 `ActivityManagerService` 是 Android 系统的核心服务之一,在 `SystemServer` 进程初始化期间被创建并启动。具体来说,当设备开机完成内核加载后,Zygote 进程会启动 `SystemServer`[^3]。 ```java public class SystemServer { private void run() { ... // 创建 Service Manager 并发布系统服务 mSystemServiceManager = new SystemServiceManager(mSystemContext); // 启动 AMS 服务实例 mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); ... } } ``` 这段代码展示了如何通过 `SystemServiceManager` 来启动 `ActivityManagerService` 实例,并将其赋值给全局变量 `mActivityManagerService`[^1]。 #### 构造函数执行 一旦 `startService()` 方法返回,就会调用 `ActivityManagerService` 类的构造函数来进行进一步初始化工作: - 设置各种成员变量,默认参数配置; - 注册必要的广播接收者监听器; - 准备好用于跨进程通信所需的 Binder 对象; - 完成其他前期准备工作; 这些操作确保了 `AMS` 能够正常运作并提供所需功能支持[^2]。 #### 组件管理准备 为了能够有效地管理调度应用组件(如活动、服务等),还需要做如下几项重要设置: - 加载已安装的应用程序信息到内存缓存中; - 建立与 Package Manager Service 的连接以便获取最新包数据; - 配置权限检查机制以保障安全访问控制; - 开启消息循环处理来自客户端的各种请求; 以上步骤共同构成了完整的 `ActivityManagerService` 启动过程,使得其具备全面管理应用程序生命周期的能力[^4]。 ```python def start_activity_manager_service(): system_server = create_system_server() service_manager = init_service_manager(system_server) ams_instance = instantiate_ams(service_manager) prepare_component_management(ams_instance) enter_message_loop() return ams_instance ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值