
普通Activity的启动就是通过调用startActivity方法启动一个新的Activity,总体流程如下图:
其中涉及到了两个进程,一个是App进程和AMS进程。整体的步骤是:
1启动者Activity向Instrumentation请求启动目标的Activity。
2 Instrumentation通过AMS在App进程的IBinder接口(IActivityManager)访问AMS,此时App进程会阻塞等待AMS的调用返回,采用的跨进程通信技术是AIDL。
3AMS会进行一系列的验证工作,如判断目标Activity实例是否存在、启动模式是什么、有没有在AndroidManifest中注册等等。
4当AMS验证结束后会通过ClinentLifeCycleManager发送事物给App进程,利用App进程在AMS进程的IBinder接口(IApplicationThread)访问App进程ApplicationThread,采用的跨进程通信方式是AIDL。
5ApplicationThread是ActivityThread的内部类,当ApplicationThread接受到来自AMS的事务后,会将事务直接转交给ActivityThread处理。
6ActivityThread通过Instrumentation利用类加载器(反射)进行实例的创建,同时利用Instrumentation回调目标Activity的生命周期。
介绍几个关键的类:
Instrumentation:Instrumentation 是 Activity 与外界联系的类(不是 Activity 本身的类都统称为外界)。目标 Activity 通过 Instrumentation 来请求启动,ActivityThread 通过 Instrumentation 来创建 Activity 和回调 Activity 的生命周期。
ActivityThread:每个应用程序只有一个唯一实例,负责对 Activity 创建的管理。ActivityThread 的内部类 ApplicationThread 只负责 App 进程和 AMS 进程的通信,将来自 AMS 的事务交给 ActivityThread 处理。
AMS,全称 ActivityManagerService,系统级服务,负责管理四大组件。
根Actvity就是我们点击手机桌面图标时,应用程序启动的第一个Activity。启动根Activity的流程其实和启动普通Activity的流程类似,只是启动根Activity时需要新建一个App进程。总体流程如下图:
其中涉及到四个进程分别是:Launcher进程、AMS进程、App进程、Zygote进程。
1点击桌面图标后,Launcher进程访问AMS进程请求启动目标Activity,采用的跨进程方式是AIDL。
2 AMS进程访问Zygote进程请求启动一个新的进程。采用的跨进程方式是Socket。
3 Zygote进程通过调用fork函数创建一个App进程。
4 App进程创建完成后,App进程访问AMS进程进行通知,采用的跨进程方式是AIDL。
5 AMS进程收到来自App进程的通知后,将启动Activity的 *** 作封装成事务,并将封装好的事务发送给App进程。
6 App进程接受到来自AMS进程的事务后,根据事务创建目标Activity,并回调目标Activity的生命周期。
本文主要是用来记录自己的学习笔记,看原文请移步: Activity 启动流程
在BPM项目实施过程中经常会用到子流程,在不同项目中,需求场景也是多种多样的。本文就几种在实施过程中收集的常见子流程场景进行简单介绍,供大家参考。
根据不同的使用场景,子流程大致可划分为以下几种类型:“复用型” 、“集成型”、“内嵌型”、“事务型”、“事件型”,后面章节将对这些类型的子流程场景和特点分别进行说明。
复用型子流程为最常用的子流程场景,顾名思义是为了复用流程定义而采用的主子流程调用模式,也被称为“调用型子流程”(BPMN规范中对应Call Activity实现,BPS产品中对应“子流程活动”图元)。这种类型的流程通常包含如下特点:
“集成型子流程”在多系统集成流程场景中应用较多,流程中的某个环节对应的是另外一个系统中的流程,通常称为“外部系统子流程”。“外部系统子流程”活动实现过程本质上是通过一系列约定好的接口服务进行调用以及回调。不同技术实现的流程系统之间交互的前提需要分别开发适配程序实现约定的服务接口。集成型子流程一般具有如下特点:
“内嵌型子流程”通常也是为了进行复用,但与“复用型子流程”不同,“内嵌型子流程”是主流程中的一部分流程片段,并非独立的流程定义。“内嵌型子流程”一般包含如下特点:
内嵌型流程图示例:示例银行贷款授信审批类流程
“事务型子流程”是一中特殊含义的“内嵌型子流程”通常称为“事务块”,除了具有内嵌子流程的特性外,其内部的活动还有“事务一致性”特点,即活动执行要么一起成功,要么一起失败。“事务型子流程”通常以如下方式来支持事务一致性保障:
“事件型子流程”是一种特殊的子流程也可称为“支线流程”,属于主流程之外的独立支线主线和分支不用连线相连,支线在某些特定的情况下才触发执行。一般具有如下特点:
综上所述,子流程的使用场景有很多,可能还有其他场景我没有接触到,欢迎大家提供更多需求场景以及对上述场景说明的一些意见一起讨论。目前我们的BPS产品目前仅支持“复用型”子流程,未来产品需要加强这方面的能力来满足更复杂的业务场景。后续我还将会对BPS产品中增加支持其他类型的子流程支持的可行性方案进行研究。
使用Broadcast广播即可
android系统中,BroadcastReceiver的设计初衷就是从全局考虑的,可以方便应用程序和系统、应用程序之间、应用程序内的通信
在获取消息activity中建立BroadcastReceiver内部类,并且注册广播
示例代码如下
//接受消息的activitypublic class MainActivity extends Activity {
private InnerReceiver receiver = new InnerReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
}
@Override
protected void onRestart() {
superonRestart();
//注册广播
IntentFilter filter = new IntentFilter("test");
registerReceiver(receiver, filter);
}
@Override
protected void onStop() {
superonStop();
取消广播
unregisterReceiver(receiver);
}
public class InnerReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//使用intent获取发送过来的数据
String msg = intentgetStringExtra("msg");
}
}
}package comexampledemo;
import androidappActivity;
import androidcontentIntent;
import androidosBundle;
import androidviewView;
import androidviewViewOnClickListener;
import androidwidgetButton;
import androidwidgetEditText;
//发送消息的activity
public class SendActivity extends Activity {
private Button btn;
private EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
btn = (Button)findViewById(Ridbutton);
text = (EditText)findViewById(Ridtext);
btnsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("test");
intentputExtra("msg", textgetText()toString());
sendBroadcast(intent);
}
});
}
}
相关源码:
调用 startActivity 或 startActivityForResult 来启动Activity。那么启动的Activity有两种情况:第一种是启动同进程内的Activity; 第二种是启动不同进程的根Activity,比如在桌面点击启动App,就是启动不同进程的Activity。这两种情况的Activity的启动流程大致相同,其流程大致是以下三个过程:
以下逐一讲解这三大过程:
下图是调用进程向system_server进程发起请求的过程:
startActivityForResult方法继续调用 InstrumentationexecStartActivity 方法。而Instrumentation类主要用来监控应用程序和系统的交互。
下图是ATMS处理startActivity过程,并回调启动进程的ApplicationThread
ATMS startActivity:
ATMS类通过一系列方法调用最终来到 startActivityAsUser 的方法,该方法先检查调用进程的权限,然后通过 getActivityStartController()obtainStarter 创建 ActivityStarter 类,并把参数设置到 ActivityStarterRequest 类中,最后执行 ActivityStarterexecute() 方法。
ActivityStarter准备堆栈
在 ActivityStarter executeRequest 方法中先做一系列的检查,包括调用进程的检查、Intent的检查、权限的检查、向PKMS获取启动Activity的ActivityInfo等信息,然后调用 startActivityUnchecked 方法开始对要启动的Activity做堆栈管理。
在 startActivityInner 方法中,根据启动模式计算出flag,在根据flag等条件启动的Activity的ActivityRecord是加入现有的Task栈中,还是创建新Task栈。为Activity准备好堆栈后,调用 RootWindowContainerresumeFocusedStacksTopActivities 方法
ActivityStack对栈的管理:
对于启动Activity对应的 ActivityStack 来说,是管理其栈中Activity的显示逻辑。而后继续调用 ActivityStackSupervisorstartSpecificActivity
ActivityStackSupervisor检查启动进程和回调ApplicationThread
在ActivityStackSupervisor中先检查要启动Activity的进程是否存在,不存在则创建进程,存在则调用 realStartActivityLocked ,realStartActivityLocked方法通过事务给回调 ApplicationThread scheduleTransaction 方法。
下图为ActivityThread启动Activity过程的时序图:
ApplicationThread类绕了一大圈,最后调用在ATMS阶段设置的ClientTransaction的CallBack的execute方法,也就是 LaunchActivityItem execute 方法,此方法创建一个 ActivityClientRecord 对象,然后调用 ActivityThread handleLaunchActivity 开启真正的Actvity启动。
真正启动Activity:
以上就是关于Activity启动流程笔记全部的内容,包括:Activity启动流程笔记、BPM中常见子流程使用场景介绍、android怎么从一个activity获取另一个activity的信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)