Android 8.0 Activity的启动流程

链接: Activity启动流程.

Android 8.0 Activity启动流程
1、Activity--------> startActivity() +4840
|
|
2、Activity--------> startActivityForResult() +4479
|
|
3、Activity--------> startActivityForResult() +4521
|
|
4、Instrumentation--------> execStartActivity() +1748
|
|

int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target, requestCode, 0, null, options);

|
|
5、ActivityManager--------> getService() +4218
|

public static IActivityManager getService() {
    return IActivityManagerSingleton.get();
}

private static final Singleton<IActivityManager> IActivityManagerSingleton =
	new Singleton<IActivityManager>() {
    @Override
    protected IActivityManager create() {
	    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
        final IActivityManager am = IActivityManager.Stub.asInterface(b);
        return am;
	}
};

ActivityManager.getService()获得的是android.app.IActivityManager.Stub.Proxy(obj)
获取可以在./LINUX/android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/core/java/android/app/IActivityManager.java +36

public static android.app.IActivityManager asInterface(android.os.IBinder obj)
{
	if ((obj==null)) {
		return null;
	}
	android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
	if (((iin!=null)&&(iin instanceof android.app.IActivityManager))) {
		return ((android.app.IActivityManager)iin);
	}
	return new android.app.IActivityManager.Stub.Proxy(obj);
}
|

(IActivityManager是ActivityManagerService的存根,ActivityManagerService还
包含一个代理服务类ActivityManagerProxy(Android 5.0之前的流程)ActivityManagerProxy--------> startActivity())
|
|以上都是在同一个进程中进行通信,下面流程就涉及到跨进程通信
|
|
6、ActivityManagerService--------> startActivity() +4604
|
|
7、ActivityManagerService--------> startActivityAsUser() +4617
|
|
8、ActivityStarter--------> startActivityMayWait() +712
|
|
9、ActivityStackSupervisor--------> resolveIntent() +1312
|
|
10、ActivityStackSupervisor--------> resolveIntent() +1317
|

ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) {
        synchronized (mService) {
            return mService.getPackageManagerInternalLocked().resolveIntent(intent, resolvedType,
                    PackageManager.MATCH_INSTANT | PackageManager.MATCH_DEFAULT_ONLY | flags
                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
        }
}

mService.getPackageManagerInternalLocked()得到的是PackageManagerInternal,PackageManagerInternal是一个抽象类,具体实现是在PackageMangerService的PackageManagerInternalImpl内部类中
|
|PackageManagerService(PackageManagerInternalImpl)----->resolveIntent() +25798
|在queryIntentActivitiesInternal()方法中进行扫描app,注册组件;涉及到Activity优先级方面的问题在chooseBestActivity()方法
|

执行完上面的PackageManagerService流程之后,返回ActivityStarter----> startActivityMayWait () +712后续流程往下
|走
|
11、ActivityStarter--------> startActivityMayWait() +829
|
|验证intent、Class、Permission等
|保存将要启动的Activity的Record
|
|
12、ActivityStarter--------> startActivityLocked() +283
|
|
13、ActivityStarter--------> startActivity() +581
|
|
14、ActivityStarter--------> startActivity() +1006
|
|
15、ActivityStarter--------> startActivityUnchecked() +1254
|
|在computeLaunchingTaskFlags()方法中
|检查将要启动的Activity的launchMode和启动Flag
|根据launcheMode和Flag配置task
||
|
16、ActivityStackSupervisor--------> resumeFocusedStackTopActivityLocked()+2109
|
|
17、ActivityStack--------> resumeTopActivityUncheckedLocked() +2267
|
|
18、ActivityStack--------> resumeTopActivityInnerLocked() +2434
|
|查找要进入暂停的Activity
|
|
19、ActivityStack--------> startPausingLocked () +1359
|

if (prev.app != null && prev.app.thread != null) {
	if (DEBUG_PAUSE) 
		Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
	try {
    		EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
       			prev.userId, System.identityHashCode(prev),
          	prev.shortComponentName);
     		mService.updateUsageStats(prev, false);
     	    prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
      			userLeaving, prev.configChangeFlags, pauseImmediately);
	} catch (Exception e) {
	        // Ignore exception, if process died other code will cleanup.
            Slog.w(TAG, "Exception thrown during pause", e);
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
    }
} else {
    mPausingActivity = null;
         mLastPausedActivity = null;
         mLastNoHistoryActivity = null;
}

prev.app.thread指的是IApplicationThread
ActivityThread的内部类ApplicationThread实现IApplicationThread.Stub的相关方法
|
|通过ipc告诉要暂停的Activity进入暂停
|
|
20、ActivityThread--------> schedulePauseActivity () +713
|
|通过查找PAUSE_ACTIVITY_FINISHING查看sendMessage后续消息通讯流程
|
|
21、ActivityThread--------> handleMessage() +1612
|
|
22、ActivityThread--------> handlePauseActivity() +3829
|
|1、正式让之前的Activity暂停
|2、告诉AMS已经暂停完成
|
|
23、ActivityThread--------> performPauseActivity () +3855
|
|
24、ActivityThread--------> performPauseActivity () +3881
|
|
25、ActivityThread--------> performPauseActivityIfNeeded() +3904
|
|
26、Instrumentation--------> callActivityOnPause () +1409
|
|
27、Activity--------> performPause () +7187
|
|
28、Activity--------> onPause () +1675
|
|此时之前的Activity已经执行完onPause暂停操作
|
执行完onPause操作,我们返回到handlePauseActivity()操作的后续流程
|
|
29、ActivityThread--------> handlePauseActivity() +3839
|
执行ActivityManager.getService().activityPaused(token)语句,就是告诉AMS已经执行完暂停操作
|
|
30、ActivityManagerService--------> activityPaused() +7610
|
|
31、ActivityStack--------> activityPausedLocked() +1425
|
|
32、ActivityStack--------> completePauseLocked() +1498
|
|
33、ActivityStackSuperVisor--------> resumeFocusedStackTopActivityLocked()+2109
|
|
34、ActivityStack--------> resumeTopActivityUncheckedLocked() +2267
|
|
35、ActivityStack--------> resumeTopActivityInnerLocked() +2754
|
|验证是否该启动的Activity所在进程和app是否存在,若存在,直接启动
|否则,准备创建该进程
|
|
36、ActivityStackSuperVisor--------> startSpecificActivityLocked() +1606
|
|该进程不存在,创建进程
|
|
37、ActivityManagerService--------> startProcessLocked() +3707
|
|
38、ActivityManagerService--------> startProcessLocked() +3821
|
|
39、ActivityManagerService--------> startProcessLocked() +3999
|
|通过Process.start(“android.app.ActivityThread”)启动进程
|
|
40、ActivityThread--------> main() +6505
|
|
41、ActivityThread--------> attach() +6354
|
|
42、ActivityManagerService--------> attachApplication() +7347
|
| IActivityManager是ActivityManagerService的存根
|
|
43、ActivityManagerService--------> attachApplicationLocked () +7280
|
|
44、ActivityStackSuperVisor--------> attachApplicationLocked() +990
|
|准备启动应用,先查找MainActivity
|
|
45、ActivityStackSuperVisor--------> realStartActivityLocked() +1473
|
|IPC通知ActivityThread
|
|
46、ActivityThread--------> scheduleLaunchActivity() +791
|
查找LAUNCH_ACTIVITY继续后续消息通信流程
|
|
47、ActivityThread----------> handleMessage() +1592
|
|
48、ActivityThread----------> handleLaunchActivity() +2859
|
|
49、ActivityThread----------> performLaunchActivity() +2672
|
|
50、Instrumentation----------> newActivity() +1175
|

public Activity newActivity(ClassLoader cl, String className,
            Intent intent)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        return (Activity)cl.loadClass(className).newInstance();
}

通过反射机制来获取类名,(Activity)cl.loadClass(className).newInstance()获取就是要启动的Activity的类名

其中一些主要的类:
1、ActivityManagerService: ActivityManagerNative
ActivityManagerService(以后简称AMS):AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它在Android中非常重要。

2、ActivityStackSupervisor : 管理整个手机任务栈
它是栈的大管家。ActivityStackSupervisor在AMS中的构造方法中被创建。

3、ActivityStack: Activity的栈(任务栈)
它是一个管理类,用来管理系统所有Activity的各种状态。

4、PackageManagerService: 完成组件在清单里的扫描和注册
它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口。因此PackageManagerService将作为服务端参与Binder通信。

5、ActivityThread: 安卓java应用层的入口函数类
ActivitiyThread是应用程序概念空间的一个概念,他建立了应用进程运行的框架,并提供了一个IActivityThread接口作为与 Activity Manager Service的通讯接口.通过该接口AMS可以将Activity的状态变化传递到客户端的Activity对象。

ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理

ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制
有关ActivityThread相关知识点可以参考: ActivityThread

启动大致流程总结
当创建一个activity,那这个activity一些相关信息就会传递到远程服务类ActivityManagerService,由ActivityManagerService发起ActivityStackSupervisor的管理,ActivityStackSupervisor会对当前的activity进行判断,判断该activity是新启一个任务还是放到旧的任务栈中,该activity是放到ActivityStack任务栈中,因为新加了一个activity,那么之前那些的activity就要进入pause状态,就需要查找哪个activity被pause,找到之后通知ActivityStackSupervisor即将被pause的activity的ActivityThread执行暂停操作,执行完暂停操作由ActivityThread回馈给ActivityManagerService, 告诉ActivityManagerService该activity已经执行完暂停操作了。由ActivityManagerService开始邀请ActivityStackSupervisor继续新的activity的复活或启动任务,然后ActivityStackSupervisor会找到ActivityStack,找到有焦点的activity并且找到顶部的activity,由顶部的activity来判断该activity应用进程是否存在,如果不存在,启动任务和进程,启动进程就会找到ActivityStackSupervisor的realStartActivity,并且通过Process.start(“android.app.ActivityThread”)启动进程,然后通过Zygote程序来fork出一个进程出来,再有底层反馈回来,去启动我们新的应用程序ActivityThread的main函数,启动完成之后通过attachApplication来启动一个application对象,把application进行绑定,继续通过连接ActivityManagerService来启动MainActivity,最终由ActivityMangerService发挥进程找到ActivityThread,调用scheduleLaunchActivity()来启动activity。

假如启动Activity A之后启动Activity B,流程为 :
1)Activity A先执行onPause() 操作
2)Activity B依次执行 onCreate()、onstart()、onResume()操作
3)Activity A执行onStop() 操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 8.0 及以上版本,为了增强应用程序的安全性,Android 引入了后台限制,禁止未在前台运行的应用程序启动服务。如果您想在后台启动服务,需要使用 `startForegroundService()` 方法。这个方法会启动一个前台服务,然后你可以在服务启动后在通知栏显示一个通知,以此来告知用户服务正在运行。 以下是一个使用 `startForegroundService()` 的示例代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建一个 NotificationChannel NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT); // 向系统注册 NotificationChannel NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } // 创建一个 Intent,启动你的服务 Intent serviceIntent = new Intent(this, YourService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 在 Android 8.0 及以上版本上,需要调用 startForegroundService() 方法启动服务。 startForegroundService(serviceIntent); } else { // 在 Android 8.0 以下版本上,可以直接调用 startService() 方法启动服务。 startService(serviceIntent); } ``` 注意:如果你使用的是 `startForeground()` 方法,会在 Android 8.0 及以上版本上抛出 `IllegalStateException` 异常,因为 Android 8.0 及以上版本禁止在后台启动服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值