Android应用程序启动过程源代码分析(2)

因此,这里的intent包含的信息为:action = "Android.intent.action.Main",category="android.intent.category.LAUNCHER", cmp="shy.luo.activity/.MainActivity",表示它要启动的Activity为shy.luo.activity.MainActivity。Intent.FLAG_ACTIVITY_NEW_TASK表示要在一个新的Task中启动这个Activity,注意,Task是Android系统中的概念,它不同于进程Process的概念。简单地说,一个Task是一系列Activity的集合,这个集合是以堆栈的形式来组织的,遵循后进先出的原则。事实上,Task是一个非常复杂的概念,有兴趣的读者可以到官网查看相关的资料。这里,我们只要知道,这个MainActivity要在一个新的Task中启动就可以了。

Step 2. Activity.startActivity

在Step 1中,我们看到,Launcher继承于Activity类,而Activity类实现了startActivity函数,因此,这里就调用了Activity.startActivity函数,它实现在frameworks/base/core/java/android/app/Activity.java文件中:

public class Activity extends ContextThemeWrapper           implements LayoutInflater.Factory,           Window.Callback, KeyEvent.Callback,           OnCreateContextMenuListener, ComponentCallbacks {          ......          @Override       public void startActivity(Intent intent) {           startActivityForResult(intent, -1);       }          ......      }  

这个函数实现很简单,它调用startActivityForResult来进一步处理,第二个参数传入-1表示不需要这个Actvity结束后的返回结果。

Step 3. Activity.startActivityForResult

这个函数也是实现在frameworks/base/core/java/android/app/Activity.java文件中:

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 {               ......           }             ......      }  

这里的mInstrumentation是Activity类的成员变量,它的类型是Intrumentation,定义在frameworks/base/core/java/android/app/Instrumentation.java文件中,它用来监控应用程序和系统的交互。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgxww.html