💪
AndroidCollect
  • 写在前面
  • 计算机基础
    • 计算机组成原理
    • 算法
      • 查找
        • 二分查找
      • 排序
        • 简单排序
        • 高级排序
        • 特殊排序
      • 海量数据
      • 思想
        • 贪心
        • 分治
        • 动态规划
        • 回溯
      • 哈希算法
    • 数据结构
      • 队列
        • 知识点
        • 相关题目
          • 用两个栈实现队列
          • 实现循环队列
          • 用链表实现队列
          • 用数组实现队列
      • 栈
        • 相关算法题目
          • 用链表实现栈
          • 用数组实现栈
      • 链表
        • 知识点梳理
        • 相关算法题目
          • 删除倒数第n个结点
          • 合并两个有序链表
          • 检测单链表是否有环
          • 获取中间结点
          • 反转链表
      • 跳表
      • 哈希表
      • 树
        • 二叉树
        • 二叉查找树
        • AVL 树
        • Trie 树
        • 红黑树
      • 堆
        • 存储
        • 堆的应用
      • 图
    • 网络
      • 应用层协议
        • DNS
        • HTTP
        • HTTPS
      • 传输层协议
        • TCP
        • UDP
      • 输入网址后发生了什么
    • 操作系统
      • 内存
    • 数据库
  • 软件工程
    • 编程思想
    • 设计模式
      • 状态模式
      • 装饰器模式
      • 代理模式
      • 责任链模式
      • 建造者模式
      • 单例模式
      • 观察者模式
  • Java
    • 基础
    • 异常
    • 并发编程
      • ThreadLocal
      • 线程池
      • 理解 volatile
      • AbstractQueuedSynchronizer
    • 集合
      • LinkedHashMap 源码
      • HashMap 源码
    • 注解
    • 反射
      • JDK 动态代理
    • JVM
      • 自动内存管理机制
      • Class 文件格式
      • 类加载机制
      • Java 内存模型(JMM)
      • 字节码指令
      • HotSpot 虚拟机实现细节
    • 源码与原理
    • 各版本主要特性
  • Android
    • 基础组件
      • Context
      • Activity
        • 生命周期
        • 启动模式与任务栈
        • 启动流程
      • Service
      • ContentProvider
      • BroadcastReceiver
      • Fragment
      • View
        • 常用控件问题总结
          • RecyclerView
          • ViewPager2
        • CoordinatorLayout
        • SurfaceView
        • 事件分发
        • 绘制流程
        • 自定义 View
        • Window
    • 数据存储
      • 存储结构
      • Sqlite
      • 序列化
      • SharedPreferences
    • 资源
      • 图片加载
    • 动画
      • 属性动画
    • 线程和进程
      • Binder 机制
      • 跨进程通信
        • AIDL
    • 内部原理
      • 消息循环机制
      • Binder
      • Window
      • SparseArray
      • ArrayMap
      • RecyclerView
      • App 启动流程
    • 性能优化
      • 内存
        • 内存使用优化
        • 内存泄漏
      • 启动优化
      • 缩减包大小
      • 布局优化
      • ANR
    • 打包构建
      • dex 文件
      • APK 打包流程
      • APK 签名流程
    • 架构
      • 运行时
      • Android 系统架构
      • 应用项目架构
    • 开源框架源码或原理
      • RxJava
        • 使用笔记
        • 源码解析
      • Retrofit
      • ButterKnife
      • BlockCanary
      • LeakCanary
      • OkHttp
      • 图片加载
        • Glide
        • Picasso
    • 碎片化处理
      • 屏幕适配
    • 黑科技
      • 热修复
    • Jetpack
      • Lifecycle
      • Room
      • WorkManager
    • 新动态
      • AndroidX
      • 各系统版本特性
  • 开发工具
    • 正则表达式
    • ADB
    • Git
  • Kotlin
  • Flutter
  • 关于作者
  • 致谢
由 GitBook 提供支持
在本页
  • Instrumentation
  • Activity
  • Instrumentation
  • 参考

这有帮助吗?

  1. Android
  2. 基础组件
  3. Activity

启动流程

Activity startActivity

@Override
public void startActivity(Intent intent) {
	startActivity(intent, null);
}
 
@Override
public void startActivity(Intent intent, Bundle options) {
	if (options != null) {
		startActivityForResult(intent, -1, options);
	} else {
		// Note we want to go through this call for compatibility with
		// applications that may have overridden the method.
		startActivityForResult(intent, -1);
	}
}
 
public void startActivityForResult(Intent intent, int requestCode) {
	startActivityForResult(intent, requestCode, null);

}

startActivityForResult

public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
	  //一般的Activity其mParent为null,mParent常用在ActivityGroup中,ActivityGroup已废弃
	  if (mParent == null) {
		    //这里会启动新的Activity,核心功能都在mMainThread.getApplicationThread()中完成
		    Instrumentation.ActivityResult ar =
			      mInstrumentation.execStartActivity(
				        this, mMainThread.getApplicationThread(), mToken, this,
				        intent, requestCode, options);
		if (ar != null) {
		    //发送结果,即onActivityResult会被调用
			  mMainThread.sendActivityResult(
				    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
				     ar.getResultData());
		}
		if (requestCode >= 0) {
			// If this start is requesting a result, we can avoid making
			// the activity visible until the result is received.  Setting
			// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
			// activity hidden during this time, to avoid flickering.
			// This can only be done when a result is requested because
			// that guarantees we will get information back when the
			// activity is finished, no matter what happens to it.
			    mStartedActivity = true;
		}
 
		final View decor = mWindow != null ? mWindow.peekDecorView() : null;
		if (decor != null) {
			decor.cancelPendingInputEvents();
		}
	} else {
		//在ActivityGroup内部的Activity调用startActivity的时候会走到这里,内部处理逻辑和上面是类似的
		if (options != null) {
			mParent.startActivityFromChild(this, intent, requestCode, options);
		} else {
			// Note we want to go through this method for compatibility with
			// existing applications that may have overridden it.
			mParent.startActivityFromChild(this, intent, requestCode);
		}
	}
}

Instrumentation execStartActivity

public ActivityResult execStartActivity(
		  Context who, IBinder contextThread, IBinder token, Activity target,
		Intent intent, int requestCode, Bundle options) {
	  //核心功能在这个whoThread中完成,其内部scheduleLaunchActivity方法用于完成activity的打开
	  IApplicationThread whoThread = (IApplicationThread) contextThread;
	  if (mActivityMonitors != null) {
		    synchronized (mSync) {
			  //先查找一遍看是否存在这个activity
			  final int N = mActivityMonitors.size();
			  for (int i=0; i<N; i++) {
				    final ActivityMonitor am = mActivityMonitors.get(i);
				    if (am.match(who, null, intent)) {
					  //如果找到了就跳出循环
					  am.mHits++;
					   //如果目标activity无法打开,直接return
					   if (am.isBlocking()) {
						    return requestCode >= 0 ? am.getResult() : null;
					   }
					   break;
				}
			}
		}
	}
	try {
		 intent.migrateExtraStreamToClipData();
		 intent.prepareToLeaveProcess();
		 //这里才是真正打开activity的地方,核心功能在whoThread中完成。
		 int result = ActivityManagerNative.getDefault()
			    .startActivity(whoThread, who.getBasePackageName(), intent,
		 intent.resolveTypeIfNeeded(who.getContentResolver()),
				token, target != null ? target.mEmbeddedID : null,
				requestCode, 0, null, null, options);
		 //这个方法是专门抛异常的,它会对结果进行检查,如果无法打开activity,
		 //则抛出诸如ActivityNotFoundException类似的各种异常
		 checkStartActivityResult(result, intent);
	 } catch (RemoteException e) {
	 }
	 return null;
}

ActivityManagerNative#getDefault

static public IActivityManager getDefault() {
    return ActivityManager.getService();
}

ActivityManager#getService

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;
                }
    };

IActivityManger 的实现类是 ActivityManagerService, startActivity 方法

@Override
public int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    return mActivityTaskManager.startActivity(caller, callingPackage, intent, resolvedType,
        resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions);
}

ActivityTaskManagerService#startactivity

@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
    Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
}

ActivityStarter#excute

int execute() {
        try {
            // TODO(b/64750076): Look into passing request directly to these methods to allow
            // for transactional diffs and preprocessing.
            if (mRequest.mayWait) {
                return startActivityMayWait(mRequest.caller, mRequest.callingUid,
                        mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid,
                        mRequest.intent, mRequest.resolvedType,
                        mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
                        mRequest.resultWho, mRequest.requestCode, mRequest.startFlags,
                        mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig,
                        mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId,
                        mRequest.inTask, mRequest.reason,
                        mRequest.allowPendingRemoteAnimationRegistryLookup,
                        mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
            } else {
                return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,
                        mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo,
                        mRequest.voiceSession, mRequest.voiceInteractor, mRequest.resultTo,
                        mRequest.resultWho, mRequest.requestCode, mRequest.callingPid,
                        mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid,
                        mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions,
                        mRequest.ignoreTargetSecurity, mRequest.componentSpecified,
                        mRequest.outActivity, mRequest.inTask, mRequest.reason,
                        mRequest.allowPendingRemoteAnimationRegistryLookup,
                        mRequest.originatingPendingIntent, mRequest.allowBackgroundActivityStart);
            }
        } finally {
            onExecutionComplete();
        }
    }

最终会调到 ApplicationThread scheduleLaunchActivity

public final void scheduleLaunchActivity() {
    // 通过 Handler 发送 LAUNCH_ACTIVITY
    sendMessage(H.LAUNCH_ACTIVITY, r);
}

ActivityThread#handleLaunchActivity

private void handleLaunchActivity() {
    // 执行启动 Activity
    Activity a = performLaunchActivity(r, customIntent);
    if (a != null) {
        // resume activity
        handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
    } else {
        
    }
}

ActivityThread#performLaunchActivity

private performLaunchActivity() {
    // Activity 信息初始化
    
    // 创建 context
    ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        // 构建 Activity
        activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
    }catch(Exception e){
        
    }
    
    try {
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        if(activity != null){
        	activity.attach();
            
            // 通过 Instrumentation 执行 Activity onCreate
            if (r.isPersistable()) {
                 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            }else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            
            if (!r.activity.mFinished) {
                // Activity onStart
            	activity.performStart();
            }
            
            // 通过 Instrumentation 执行 Activity onRestoreInstanceState
            if (!r.activity.mFinished) {
            	if (r.isPersistable()) {
                	if (r.state != null || r.persistentState != null) {
                    	mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                    r.persistentState);
                    }
                } else if (r.state != null) {
                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                }
            }
            
             // 通过 Instrumentation 执行 Activity onPostCreeate
            if (!r.activity.mFinished) {
            	if (r.isPersistable()) {
                    mInstrumentation.callActivityOnPostCreate(activity, r.state,
                                r.persistentState);
                }else {
                    mInstrumentation.callActivityOnPostCreate(activity, r.state);
                }
            }       
    }
        
    return activity;
    
}
final void handleResumeActivity() {
    r = performResumeActivity();
    if(r != null) {
        final Activity a = r.activity;
        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            decor.setVisibility(View.INVISIBLE);
            ViewManager wm = a.getWindowManager();
            if (a.mVisibleFromClient) {
            	if (!a.mWindowAdded) {
                	a.mWindowAdded = true;
                    // window
                    wm.addView(decor, l);
                }
            }
        }
    }
}

resume 之后才开始添加View

public final ActivityClientRecord performResumeActivity() {
 	if (r != null && !r.activity.mFinished) {
    	try {
            // 处理等待的 Intent
            if (r.pendingIntents != null) {
            	deliverNewIntents(r, r.pendingIntents);
                r.pendingIntents = null;
            }
            // 处理等待的 result
            if (r.pendingResults != null) {
            	deliverResults(r, r.pendingResults);
                r.pendingResults = null;
            }
            // 执行 resume
            r.activity.performResume();
        }
    }
}

Instrumentation

public Activity newActivity(){
    return (Activity)cl.loadClass(className).newInstance();
}
private void callActivityOnCreate(){
    prePerformCreate(activity);
    activity.performCreate(icicle);
    postPerformCreate(activity);
}

Activity

final void performCreate() {
    restoreHasCurrentPermissionRequest(icicle);
    // 调用 onCreate
    onCreate(icicle);
    mActivityTransitionState.readState(icicle);
    performCreateCommon();
}
final void performStart() {
    mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
    mInstrumentation.callActivityOnStart(this);
    mActivityTransitionState.enterReady(this);
}
final void performResume() {
    // 执行 restart
    performRestart();
    mInstrumentation.callActivityOnResume(this);
}
final void performRestart() {
    if (mStopped) {
        mStopped = false;
        mInstrumentation.callActivityOnRestart(this);
        // 执行 start
        performStart();
    }
}

Instrumentation

public void callActivityOnStart() {
    activity.onStart();
}
public void callActivityOnResume() {
     activity.mResumed = true;
    activity.onResume();
}
public void callActivityOnRestart() {
    activity.onRestart();
}

参考

上一页启动模式与任务栈下一页Service

最后更新于5年前

这有帮助吗?

Activity启动流程(基于Android26)
startActivity启动过程分析
Activity 启动流程