【1】Android源码阅读:一个Activity是如何启动的?

2016-12-21 07:42:22来源:CSDN作者:happy_horse人点击

这几天心情很不好,我也不知道是什么原因,虽然一直的习惯是找到事物/念想产生的原因,但是这一回却真是找不到原因了,哈哈,人丑还是要多读书啊。不过,不管怎样,不管周围的人的变得怎样,周围的世界变得怎样,依然要保持学习,做自己想做的事,做一个开心而有价值的人。

想起一首诗以自勉:

自小刺头深草里,而今渐觉出蓬蒿。 时人不识凌云木,直待凌云始道高。         -唐代杜荀鹤 《小松》

Activity的启动从startActivity起:

 startActivity(new Intent(MainActivity.this, LayerListActivity.class));

会调到Activity的源码:

/**     * Same as {@link #startActivity(Intent, Bundle)} with no options  //方法的多态,同名不同参;     * specified.     *     * @param intent The intent to start.     *     * @throws android.content.ActivityNotFoundException//如果在清单文件中没找到对应的activity,会抛出这个异常;     *     * @see {@link #startActivity(Intent, Bundle)}     * @see #startActivityForResult     */    @Override    public void startActivity(Intent intent) {        this.startActivity(intent, null);    }

先了解一下 类ActivityNotFoundException:

//是运行时异常的子类//包含两个构造方法package android.content;public class ActivityNotFoundException extends  RuntimeException {    public ActivityNotFoundException()    {    }    public ActivityNotFoundException(String name)    {        super(name);    }};

关于Java 异常类层次结构图:

这里写图片描述

回到正题,然后调用同名方法:

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

其中作为if 条件的ActivityOptions,兼容包是ActivityOptionsCompat,和页面切换的转场动画相关。它的主要方法是:

这里写图片描述

不管怎样,最后都调到 activity.startActivityForResult :

public class Activity extends ContextThemeWrapper          implements LayoutInflater.Factory,          Window.Callback, KeyEvent.Callback,          OnCreateContextMenuListener, ComponentCallbacks {      ......      public void startActivityForResult(Intent intent, int requestCode) {          if (mParent == null) {              Instrumentation.ActivityResult ar =                  mInstrumentation.execStartActivity(                  this, mMainThread.getApplicationThread(), mToken, this,                  intent, requestCode);              ......          } else {              ......          }      ......  }  
  1. 这里的mInstrumentation的类型是Intrumentation,定义在frameworks/base/core/java/android/app/Instrumentation.java文件中,它用来监控应用程序和系统的交互。ActivityResult 是它的内部静态类。
  2. 这里的mMainThread也是Activity类的成员变量,它的类型是ActivityThread,它代表的是应用程序的主线程。
  3. 通过mMainThread.getApplicationThread获得它里面的ApplicationThread成员变量,它是一个Binder对象,后面我们会看到,ActivityManagerService会使用它来和ActivityThread来进行进程间通信。
  4. 需注意的是,这里的mMainThread代表的是Launcher应用程序运行的进程。
  5. 这里的mToken也是Activity类的成员变量,它是一个Binder对象的远程接口。
public ApplicationThread getApplicationThread()    {        return mAppThread;    }private class ApplicationThread extends ApplicationThreadNative{}public abstract class ApplicationThreadNative extends Binder        implements IApplicationThread {}public interface IApplicationThread extends IInterface {    void schedulePauseActivity();    void scheduleStopActivity();    void scheduleResumeActivity();    void scheduleDestroyActivity();    ......}

其中IInterface 接口如下:

package android.os;/** * Base class for Binder interfaces.  When defining a new interface, * you must derive it from IInterface. */public interface IInterface{    public IBinder asBinder();}

其中IBinder 接口如下:

public interface IBinder { public boolean transact(int code, Parcel data, Parcel reply, int flags)        throws RemoteException;}

参考致谢:
(1)、Android应用程序内部启动Activity过程(startActivity)的源代码分析

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台