android Activity启动过程-startActivity
来源:互联网 发布:农村淘宝怎么做的 编辑:程序博客网 时间:2024/06/05 21:00
1.startActivity说起:activity里的startActivity最终会走到IActivityManager的startActivity
Activity.java
@Override public void startActivity(Intent intent) { startActivity(intent, null); }
Activity.java
@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); } }
Activity.java
public void startActivityForResult(Intent intent, int requestCode, Bundle options) { if (mParent == null) { Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { 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; } } else { 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.java
*/ public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity 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 != null ? target.mEmbeddedID : null, requestCode, 0, null, null, options); checkStartActivityResult(result, intent); } catch (RemoteException e) { } return null; }IActivityManager有两个子类:ActivityManagerProxy,ActivityManagerNative,不难看出,是用了代理,走startActivity的是ActivityManagerProxy
ActivityManagerProxy.java
public int startActivity(IApplicationThread caller, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, String profileFile, ParcelFileDescriptor profileFd, Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); data.writeString(profileFile); if (profileFd != null) { data.writeInt(1); profileFd.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; }
可以看出,走的是进程通讯的路子,这里的
mRemote就是:IBinder b = ServiceManager.getService("activity");
这个binder是ActivityManagerService(传说中的AMS登场!):
(因为在SystemServer.java的run()中有调用
ActivityManagerService.setSystemProcess();里的
ServiceManager.addService("activity", m);)
通过Binder的transact方法把意图传送出去。
0 0
- android Activity启动过程-startActivity
- Activity的启动过程--startActivity()
- activity的启动模式,startactivity的过程
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中使用startActivity()启动Activity
- Android中启动Activity(startActivity)流程图分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- [转载] Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 百度网站地图创建插件连接
- 高频头调试
- iOS 之从影片中获取每一帧图片
- Unity摄像机适配
- iOS远程通知详解
- android Activity启动过程-startActivity
- 实例说明什么是代码的坏味道,如何重构
- MTP in Android
- c#实现曲线编辑
- 【入职快+公司大+年终奖+分红】约一个牛逼哄哄的web前端开发攻城狮
- iOS 之影片播放MediaPlayer和AVPlayer
- 建立个人GitServer(一)
- Android--UI之ImageView
- 内部邮箱仿QQ选择发送人,抄送人