一、如何跨App启动Activity
- 共享UId 的App
- 使用exported
- 使用隐式调用IntentFilter
跨App启动Activity注意点
- 跨App 启动 Activity 首先要明确 App 之间的关系
- 外部可启动exported 或有intentFilter 的 Activity
- 可外部启动的 Activity 需要注意拒绝服务漏洞
- 尽量不暴露 Activity,为暴露的 Activity 加权限控制
二、根Activity启动流程
- 点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的ActivityManagerService发起startActivity的请求
- ActivityManagerService的作用:解析Activity信息,处理启动参数,启动目标进程,绑定新进程
- system_server进程接收到请求后,采用Socket IPC向Zygote进程发出创建APP进程的请求;
Zygote进程fork出新的进程,即APP进程; - APP进程通过Binder IPC向system_server进程发起attachApplication请求;
system_server进程在接收到请求后,进行一系列的准备工作后,再通过Binder IPC向APP进程发送scheduleLaunchActivity的请求 - APP进程接收到请求后,通过Handler向主线程发送LAUNCH_ACTIVITY消息
- 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等生命周期方法
ActivityManagerProxy是AMS的远程接口,ApplicationThreadProxy是ApplicationThread的远程接口。
三、Activity进程内启动
- APP进程通过Binder IPC向system_server进程发起请求
- system_server在接收到请求后,进行一系列准备工作(解析Activity信息,处理启动参数),再通过Binder IPC向APP进程发送消息
- APP进程在接收到请求后,创建目标Activity,进入Activity的生命周期。
四、Activity的参数传递
1.通过 Intent 传递,请求进程与system_server进程传递消息通过Bundle传递消息,经过Bindler缓冲区
可携带的数据类型
1) 基本数据类型传递
2) String、基本数据类型的数组、ArrayList、HashMap
3) 自定义数据类型传递
实现 Serializable 接口
实现 Parcelable 接口
2.通过全局变量传递
创建一个工具类,提供get、set方法
注意:在不需要使用后,要及时的将全局变量置为 null, 让GC进行回收
3.通过 SharedPreferences 传递
4.通过数据库传递
5.通过文件传递