Activity的启动

一、如何跨App启动Activity

  • 共享UId 的App 
  • 使用exported 
  • 使用隐式调用IntentFilter 

跨App启动Activity注意点

  • 跨App 启动 Activity 首先要明确 App 之间的关系
  • 外部可启动exported 或有intentFilter 的 Activity
  • 可外部启动的 Activity 需要注意拒绝服务漏洞
  • 尽量不暴露 Activity,为暴露的 Activity 加权限控制

二、根Activity启动流程

  1. 点击桌面APP图标,Launcher进程采用Binder IPC的方式向system_server进程的ActivityManagerService发起startActivity的请求
  2. ActivityManagerService的作用:解析Activity信息,处理启动参数,启动目标进程,绑定新进程
  3. system_server进程接收到请求后,采用Socket IPC向Zygote进程发出创建APP进程的请求;
    Zygote进程fork出新的进程,即APP进程;
  4. APP进程通过Binder IPC向system_server进程发起attachApplication请求;
    system_server进程在接收到请求后,进行一系列的准备工作后,再通过Binder IPC向APP进程发送scheduleLaunchActivity的请求
  5. APP进程接收到请求后,通过Handler向主线程发送LAUNCH_ACTIVITY消息
  6. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等生命周期方法

ActivityManagerProxy是AMS的远程接口,ApplicationThreadProxy是ApplicationThread的远程接口。

Activity的启动_第1张图片

 三、Activity进程内启动

  1. APP进程通过Binder IPC向system_server进程发起请求
  2. system_server在接收到请求后,进行一系列准备工作(解析Activity信息,处理启动参数),再通过Binder IPC向APP进程发送消息
  3. 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.通过文件传递

 

你可能感兴趣的:(Android:基础篇,android)