jQuery鼠标指针特效

Android 11: Activity的启动流程

客户端

ContextImpl.java -> startActivity(Intent intent, Bundle options)

Instrumentation.java -> execStartActivity(...)
{
    ...
    //ActivityTaskManager利用binder,从客户端调用服务端的函数 1.0
    int result = ActivityTaskManager.getService().startActivity(whoThread,
                    who.getBasePackageName(), who.getAttributionTag(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()), token,
                    target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
    checkStartActivityResult(result, intent);//检查启动Activity的结果,看是否存在异常 比如1.1
    ... 
}
    
//1.0 引用
/*  ActivityTaskManager.java
public static IActivityTaskManager getService() {
    return IActivityTaskManagerSingleton.get();
}

@UnsupportedAppUsage()
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
        new Singleton<IActivityTaskManager>() {
            @Override
            protected IActivityTaskManager create() {
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                return IActivityTaskManager.Stub.asInterface(b);
            }
};*/

//1.1
checkStartActivityResult(int res, Object intent)
{
    ...
            case ActivityManager.START_INTENT_NOT_RESOLVED:
            case ActivityManager.START_CLASS_NOT_FOUND:
                if (intent instanceof Intent && ((Intent)intent).getComponent() != null)
                    throw new ActivityNotFoundException(
                            "Unable to find explicit activity class "
                            + ((Intent)intent).getComponent().toShortString()
                            + "; have you declared this activity in your AndroidManifest.xml?");
                throw new ActivityNotFoundException(
                        "No Activity found to handle " + intent);
            case ActivityManager.START_PERMISSION_DENIED:
                throw new SecurityException("Not allowed to start activity "
                        + intent);
    ...
}

服务端

ActivityTaskManagerService.java -> startActivityAsUser(...)

{
    ...
    // TODO: Switch to user app stacks here.
	return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
			.setCaller(caller)
			.setCallingPackage(callingPackage)
			.setCallingFeatureId(callingFeatureId)
			.setResolvedType(resolvedType)
			.setResultTo(resultTo)
			.setResultWho(resultWho)
			.setRequestCode(requestCode)
			.setStartFlags(startFlags)
			.setProfilerInfo(profilerInfo)
			.setActivityOptions(opts)
			.setUserId(userId)
			.execute();

    ...
}
/*
obtainStarter()方法实际是调用了mFactory.obtain(),
而mFactory为ActivityStarter的内部类DefaultFactory,看下DefaultFactory的obtain()

frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

static class DefaultFactory implements Factory {
    private final int MAX_STARTER_COUNT = 3;
    private SynchronizedPool<ActivityStarter> mStarterPool =
                new SynchronizedPool<>(MAX_STARTER_COUNT);
                
    public ActivityStarter obtain() {
        ActivityStarter starter = mStarterPool.acquire();
    
        if (starter == null) {
            if (mService.mRootWindowContainer == null) {
                throw new IllegalStateException("Too early to start activity.");
            }
            starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
        }
    
        return starter;
    }
}

obtain()的目的是拿到一个ActivityStarter对象,用来启动activity.
每个Intent对应一个ActivityStarter这里使用了SynchronizedPool--简单的对象池来管理对象的生产,
对象池里有3个对象,如果申请时池子里没有可用对象,则直接new一个!
*/
ActivityStartController.java -> execute()

ActivityStarter.java -> executeRequest()
{
    
    ...
    (合法性检查abort)
    2.0 权限检查 (ActivityStackSupervisor)mSupervisor.checkStartAnyActivityPermission()
    2.1 是否能后台启动  shouldAbortBackgroundActivityStart()
    2.2 拦截器  (ActivityStartInterceptor)mInterceptor.setStates() 例如,因为目标用户当前处于静默状态模式(关闭工作)或目标应用程序被挂起.
    通过ActivityStartInterceptor检查各种拦截情况,如认为是潜在的恶意app(HarmfulApp)则改变intent为警告页面,到时不会跳转到原请求的activity
    
    2.3 权限回顾 isPermissionsReviewRequired() 如果需要在启动真正目标activity前跳转到权限review页面,
    则将原intent改为pending Intent传给review页面,待review结束后再继续启动
    
    //2.4 Instant app(ephemeral app)启动ephemeral installer
    2.5 创建ActivityRecord , final ActivityRecord r = new ActivityRecord(mService,..)
    ...
    
}
-> startActivityUnchecked(...) -> startActivityInner(...) 
{
    在ActivityStarer::startActivityInner方法中,通过getOrCreateRootTask()创建Task,
    而后通过setNewTask方法将新建的ActivityRecord进行挂在到新建的Task上.
    这一步AMS吧ActivityRecord和Task创建并且挂载到层级树,接下来是处理新的Activity启动和显示
}
RootWindowContainer
//堆栈打印

RootWindowContainer.java->resumeFocusedStacksTopActivities()->ActivityStack::resumeTopActivityUncheckedLocked()
{
    ...
    if (!resumedOnDisplay) {
    /*如果没有可用的activity在栈顶的时候,例如,设备刚刚启动或启动器崩溃,
    程序会请求恢复集中堆栈中的顶部活动,确保至少在home活动被启动和恢复
    */
    final ActivityStack focusedStack = display.getFocusedStack();
    if (focusedStack != null) {
        result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    } else if (targetStack == null) {
            result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
                display.getDefaultTaskDisplayArea());
        }
    }
    ...
}

/*
RootWindowContainer::resumeFocusedTasksTopActivities
    Task::resumeTopActivityUncheckedLocked
        Task::resumeTopActivityInnerLocked
            TaskFragment::resumeTopActivity 
                TaskDisplayArea::pauseBackTasks  --   2.2.1 pause LauncherActivity  (让之前启动activity(上一个应用) 进入onPause )
                    WindowContainer::forAllLeafTask
                        TaskFragment::forAllLeafTaskFragments
                            TaskFragment::startPausing
                                TaskFragment::startPausing
                                    TaskFragment::schedulePauseActivity --构建 PauseActivityItem,这里是触发暂停launch
                ActivityTaskManagerService::startProcessAsync     -- 2.2.2创建app进程

*/

->ActivityStack::resumeTopActivityInnerLocked()-> ActivityStack::resumeTopActivityInnerLocked()-> ActivityStack::startPausingLocked()
{
    ...
    ActivityRecord prev = mResumedActivity;
    ...
    mAtmService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
                        prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
                                prev.configChangeFlags, pauseImmediately));
    ...
}

->ClientLifecycleManager::scheduleTransaction() -> ClientTransaction::schedule()

->ApplicationThread::scheduleTransaction() -> ClientTransactionHandler::scheduleTransaction()->ClientTransactionHandler::sendMessage()

->内部类 H extends Handler 收到消息 case -> TransactionExecutor::performLifecycleSequence()
ActivityThread
//下面是重点
/*
ActivityThread::handleLaunchActivity
        ActivityThread::performLaunchActivity
            Instrumentation::newActivity --- 创建Activity
            Activity::attach  ---处理Window相关
                Window::init
                Window::setWindowManager
            Instrumentation::callActivityOnCreate ---onCreate流程
                Activity::performCreate
                    Activity::onCreate  --activity流程over
*/
-> ActivityThread::handleLaunchActivity(...)-> ActivityThread::performLaunchActivity(...)
{
    ...
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        //创建Activity
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    } catch (Exception e) {
        if (!mInstrumentation.onException(activity, e)) {
            throw new RuntimeException(
                "Unable to instantiate activity " + component
                + ": " + e.toString(), e);
        }
    }
    ...
    //执行attach,内部创建Window
    activity.attach(appContext, this, getInstrumentation(), r.token,
        r.ident, app, r.intent, r.activityInfo, title, r.parent,
        r.embeddedID, r.lastNonConfigurationInstances, config,
        r.referrer, r.voiceInteractor, window, r.configCallback,
        r.assistToken);
    
    ...
    //通知activity
    if (r.isPersistable()) {
            mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
        } else {
            mInstrumentation.callActivityOnCreate(activity, r.state);
        }

    ...

}

-> Instrumentation::newActivity(...) -> Instrumentation::callActivityOnCreate(...)

// perform 执行
-> Activity::performCreate() ->Activity::onCreate()

【Android 13源码分析】Activity启动流程-2 -

Android 11源码分析: Activity的启动流程 -

posted @ 2024-07-04 19:37  僵小七  阅读(32)  评论(0编辑  收藏  举报