zoukankan      html  css  js  c++  java
  • android Activity启动过程(一)从startActivty开始说起

      从启动startActivity开始说起

    MainActivity.startActivity() 
    Activity.startActivity() 
    Activity.startActivityForResult 
    Instrumentation.execStartActivty 
    ActivityManagerNative.getDefault().startActivity() 

    Activity.java

     调用startActivty实际上最后还是调用了startActivityForResult 方法

       Override
    public void startActivity(Intent intent) {
            this.startActivity(intent, null);
    }
        @Override
    public void startActivity(Intent intent, @Nullable 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);
            }
    }
        @Override
    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (mParent == null) {
          //真正执行启动activity的代码逻辑
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            //启动activity返回的结果处理
            if (ar != null) {
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            }
            if (requestCode >= 0) {
         
                 mStartedActivity = true;
            }
    
            cancelInputsAndStartExitTransition(options);
            // TODO Consider clearing/flushing other event sources and events for child windows.
        } 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);
            }
        }
    }

    实际上调用的启动startActivityForResult方法的最终还是通过Instrumentation类来执行execStartActivity

    Instrumentation.java

    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
       //这个whoThread执行了启动activity
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        Uri referrer = target != null ? target.onProvideReferrer() : null;
        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
        if (mActivityMonitors != null) {
            synchronized (mSync) {
                final int N = mActivityMonitors.size();
              //遍历一遍,查询是否存在这个activity,activity类存放在intent中。
                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();
            //这里通过ActivityManager启动了activity
            int result = ActivityManagerNative.getDefault()
                    .startActivity(whoThread, who.getBasePackageName(), intent,
                            intent.resolveTypeIfNeeded(who.getContentResolver()),
                            token, target != null ? target.mEmbeddedID : null,
                            requestCode, 0, null, options);
            //检查启动activity返回的结果
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

     执行activity的启动过程的是ActivityManagerNative.getDefault().startActivity

    ActivityManagerNative.java

    public abstract class ActivityManagerNative extends Binder implements IActivityManager
    {
        private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
           protected IActivityManager create() {
                IBinder b = ServiceManager.getService("activity");
                if (false) {
                    Log.v("ActivityManager", "default service binder = " + b);
                }
                IActivityManager am = asInterface(b);
                if (false) {
                    Log.v("ActivityManager", "default service = " + am);
                }
                return am;
            }
        };
        
        static public IActivityManager asInterface(IBinder obj) {  
            if (obj == null) {  
                return null;  
            }  
            IActivityManager in =  
                (IActivityManager)obj.queryLocalInterface(descriptor);  
            if (in != null) {  
                return in;  
            }  
      
            return new ActivityManagerProxy(obj);  
        }  
    
     
        static public IActivityManager getDefault() {
            return gDefault.get();
        }
        
      public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
                throws RemoteException {
            switch (code) {
            case START_ACTIVITY_TRANSACTION:
            {
                data.enforceInterface(IActivityManager.descriptor);
                IBinder b = data.readStrongBinder();
                IApplicationThread app = ApplicationThreadNative.asInterface(b);
                String callingPackage = data.readString();
                Intent intent = Intent.CREATOR.createFromParcel(data);
                String resolvedType = data.readString();
                IBinder resultTo = data.readStrongBinder();
                String resultWho = data.readString();
                int requestCode = data.readInt();
                int startFlags = data.readInt();
                ProfilerInfo profilerInfo = data.readInt() != 0
                        ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
                Bundle options = data.readInt() != 0
                        ? Bundle.CREATOR.createFromParcel(data) : null;
                int result = startActivity(app, callingPackage, intent, resolvedType,
                        resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
                reply.writeNoException();
                reply.writeInt(result);
                return true;
            }
            ...
        }
    }
    1. gDefault.get()返回的就是一个IActivityManager的单例gDefault
    2. IBinder b = ServiceManager.getService("activity")获取一个IBinder这个就是和远程通信的, 也就是ActivityManagerService
    3. 可以在asInterface(IBinder obj) 调用就是返回的ActivityManagerProxy就是ActivityManagerService的远程代理类。

    ActivityManagerNative.java#ActivityManagerProxy

    class ActivityManagerProxy implements IActivityManager
    {
        private IBinder mRemote;
        public ActivityManagerProxy(IBinder remote)
        {
            mRemote = remote;
        }
    
        public IBinder asBinder()
        {
            return mRemote;
        }
    
        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;
        }
    
    ...
        
    }

     mRemote是一个IBinder,调用了IBinder的transact()方法,这说明了启动Activity实际上也是进行了进程间的通信

  • 相关阅读:
    七十九:flask.Restful之flask-Restful蓝图与渲染模板
    七十九:flask.Restful之flask-Restful标准化返回参数示例
    七十八:flask.Restful之flask-Restful标准化返回参数以及准备数据
    七十七:flask.Restful之flask-Restful参数验证
    七十六:flask.Restful之flask-Restful插件的基本使用
    七十五:flask.Restful之Restful.API介绍
    七十四:flask信号之flask的内置信号
    七十三:flask信号之信号机制和使用场景
    七十二:flask钩子函数之关于errorhandler的钩子函数
    七十一:flask钩子函数之关于context_processor的钩子函数
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/9149210.html
Copyright © 2011-2022 走看看