Android的四大組件中除了BroadCastReceiver以外,其他三種組件都必須在AndroidManifest中注冊(cè),對(duì)于BroadCastReceiver來(lái)說(shuō),它既可以在AndroidManifest中注冊(cè)也可以通過(guò)代碼來(lái)注冊(cè),在調(diào)用方式上,Activity、Service和BroadCastReceiver需要借助Intent,而ContentProvider則無(wú)需借助Intent。

Activity是一種展示型組件,用于向用戶直接展示一個(gè)界面,并且可以接收用戶的輸入信息從而進(jìn)行交互,對(duì)于用戶來(lái)說(shuō),Activity就是一個(gè)Android應(yīng)用的全部,這是因?yàn)槠渌蠼M件對(duì)用戶來(lái)說(shuō)都是不可感知的。Activity的啟動(dòng)由Intent觸發(fā),其中Intent可以分為顯式Intent和隱式Intent,顯式Intent可以明確地指向一個(gè)Activity組件,隱式Intent則指向一個(gè)或多個(gè)目標(biāo)Activity組件,當(dāng)然也有可能沒(méi)有一個(gè)Activity組件處理這個(gè)Intent。

Activity的工作過(guò)程

要分析Activity的啟動(dòng)過(guò)程,就需要從startActivity方法開(kāi)始分析,startActivity方法有好幾種重載方式,但是最終都會(huì)調(diào)用startActivityForResult方法,具體代碼如下:

/**     * @hide     */
    @Override
    public void startActivityForResult(
            String who, Intent intent, int requestCode, @Nullable Bundle options) {
        Uri referrer = onProvideReferrer();        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
        options = transferSpringboardActivityOptions(options);
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(                this, mMainThread.getApplicationThread(), mToken, who,
                intent, requestCode, options);        if (ar != null) {
            mMainThread.sendActivityResult(
   &nbs