Activity启动流程阅读
来源:互联网 发布:linux如何卸载jdk 编辑:程序博客网 时间:2024/05/16 07:00
启动Activity
一般我们使用context.startActivity();
public abstract void startActivity(Intent intent);
Context是个抽象类,接着找Context的实现类ContextImpl.java
public void startActivity(Intent intent) { warnIfCallingFromSystemProcess(); startActivity(intent, null); }
调用
@Override public void startActivity(Intent intent, Bundle options) { warnIfCallingFromSystemProcess(); if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { throw new AndroidRuntimeException( "Calling startActivity() from outside of an Activity " + " context requires the FLAG_ACTIVITY_NEW_TASK flag." + " Is this really what you want?"); } mMainThread.getInstrumentation().execStartActivity( getOuterContext(), mMainThread.getApplicationThread(), null, (Activity) null, intent, -1, options); }
执行 execStartActivity
public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, String target, Intent intent, int requestCode, Bundle options) { IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { 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++; if (am.isBlocking()) { return requestCode >= 0 ? am.getResult() : null; } break; } } } } try { intent.migrateExtraStreamToClipData(); intent.prepareToLeaveProcess(); int result = ActivityManagerNative.getDefault() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target, requestCode, 0, null, options); checkStartActivityResult(result, intent); } catch (RemoteException e) { throw new RuntimeException("Failure from system", e); } return null; }
循环mActivityMonitors 集合 如果监视器里有相应的Activity直接返回
否则 执行 ActivityManagerNative.getDefault()
.startActivity()
ActivityManagerNative.getDefault() 得到的 IActivityManager 接口 需要去找实现类 ActivityManagerNative
最终startActivity() 是通过 ActivityManagerProxy 代理实现的
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); data.writeString(callingPackage); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); if (profilerInfo != null) { data.writeInt(1); profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { data.writeInt(0); } if (options != null) { data.writeInt(1); options.writeToParcel(data, 0); } else { data.writeInt(0); } mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); reply.readException(); int result = reply.readInt(); reply.recycle(); data.recycle(); return result; }
0 0
- Activity启动流程阅读
- 源码阅读---AMS与Activity启动流程
- Android入门 —— activity的启动流程源码阅读
- Activity的启动流程
- activity 启动流程分析
- Activity启动流程
- activity启动流程
- Activity的启动流程
- Activity的启动流程
- activity 启动流程分析
- Activity启动流程
- Activity 视图启动流程
- Activity的启动流程
- Activity启动流程
- activity的启动流程
- Activity启动流程
- Activity的启动流程
- Activity的启动流程
- linux tail命令的使用方法详解
- openwrt源码框架解析
- RecyclerView 使用教程
- 观雪
- 愁
- Activity启动流程阅读
- ST学习笔记
- RxAndroid 应用(三)(简易天气App之Observable内存泄露)
- [BZOJ1251] 序列终结者
- JSON和XML的比较
- 惜
- 图像算法---磨皮算法研究汇总
- OC中NSString/NSArray/#define宏定义的解析
- 关于Android Studio 编译classpath ‘gradle:2.0.0-alpha3’出错