1. 程式人生 > >Android原始碼解析之應用程式在新的程序中啟動新的Activity的方法和過程分析

Android原始碼解析之應用程式在新的程序中啟動新的Activity的方法和過程分析

轉載自:http://blog.csdn.net/luoshengyang/article/details/6720261

       前面我們在分析Activity啟動過程的時候,看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的方法和過程。

        在前面Android程序間通訊(IPC)機制Binder簡要介紹和學習計劃一文中,我們提到,在Android系統中,每一個應用程式都是由一些Activity和Service組成的,一般Service執行在獨立的程序中,而Activity有可能執行在同一個程序中,也有可能執行在不同的程序中。在前面

Android系統在新程序中啟動自定義服務過程(startService)的原理分析一文中,我們已經介紹了使用Activity.startService介面來在新程序中啟動Service的過程,然後又在前面Android應用程式內部啟動Activity過程(startActivity)的原始碼分析一文中介紹了使用Activity.startActivity介面來在原來的程序中啟動Activity的過程,現在,我們就來看一下同一個Android應用程式如何在新的程序中啟動新的Activity。

        老規矩,我們通過例子來介紹Android應用程式在新的程序中啟動新的Activity的方法以及分析其過程。首先在Android原始碼工程中建立一個Android應用程式工程,名字就稱為Process吧。關於如何獲得Android原始碼工程,請參考

在Ubuntu上下載、編譯和安裝Android最新原始碼一文;關於如何在Android原始碼工程中建立應用程式工程,請參考在Ubuntu上為Android系統內建Java應用程式測試Application Frameworks層的硬體服務一文。這個應用程式工程定義了一個名為shy.luo.process的package,這個例子的原始碼主要就是實現在這裡了。下面,將會逐一介紹這個package裡面的檔案。

        應用程式的預設Activity定義在src/shy/luo/process/MainActivity.java檔案中:

  1. package shy.luo.process;       
  2. import android.app.Activity;      
  3. import android.content.Intent;      
  4. import android.os.Bundle;      
  5. import android.util.Log;      
  6. import android.view.View;      
  7. import android.view.View.OnClickListener;      
  8. import android.widget.Button;      
  9. publicclass MainActivity extends Activity  implements OnClickListener {      
  10.     privatefinalstatic String LOG_TAG = "shy.luo.process.MainActivity";      
  11.     private Button startButton = null;      
  12.     @Override
  13.     publicvoid onCreate(Bundle savedInstanceState) {      
  14.         super.onCreate(savedInstanceState);      
  15.         setContentView(R.layout.main);      
  16.         startButton = (Button)findViewById(R.id.button_start);      
  17.         startButton.setOnClickListener(this);      
  18.         Log.i(LOG_TAG, "Main Activity Created.");      
  19.     }      
  20.     @Override
  21.     publicvoid onClick(View v) {      
  22.         if(v.equals(startButton)) {      
  23.             Intent intent = new Intent("shy.luo.process.subactivity");      
  24.             startActivity(intent);      
  25.         }      
  26.     }      
  27. }      
        和前面文章的例子一樣,它的實現很簡單,當點選它上面的一個按鈕的時候,就會啟動另外一個名字為“shy.luo.process.subactivity”的Actvity。
        名字為“shy.luo.process.subactivity”的Actvity實現在src/shy/luo/process/SubActivity.java檔案中:
  1. package shy.luo.process;      
  2. import android.app.Activity;      
  3. import android.os.Bundle;      
  4. import android.util.Log;      
  5. import android.view.View;      
  6. import android.view.View.OnClickListener;      
  7. import android.widget.Button;      
  8. publicclass SubActivity extends Activity implements OnClickListener {      
  9.     privatefinalstatic String LOG_TAG = "shy.luo.process.SubActivity";      
  10.     private Button finishButton = null;      
  11.     @Override
  12.     publicvoid onCreate(Bundle savedInstanceState) {      
  13.         super.onCreate(savedInstanceState);      
  14.         setContentView(R.layout.sub);      
  15.         finishButton = (Button)findViewById(R.id.button_finish);      
  16.         finishButton.setOnClickListener(this);      
  17.         Log.i(LOG_TAG, "Sub Activity Created.");      
  18.     }      
  19.     @Override
  20.     publicvoid onClick(View v) {      
  21.         if(v.equals(finishButton)) {      
  22.             finish();      
  23.         }      
  24.     }      
  25. }      
        它的實現也很簡單,當點選上面的一個銨鈕的時候,就結束自己,回到前面一個Activity中去。
        再來重點看一下應用程式的配置檔案AndroidManifest.xml:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="shy.luo.task"
  4.     android:versionCode="1"
  5.     android:versionName="1.0">
  6.     <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7.         <activityandroid:name=".MainActivity"
  8.                   android:label="@string/app_name">
  9.                   android:process=":shy.luo.process.main"
  10.             <intent-filter>
  11.                 <actionandroid:name="android.intent.action.MAIN"/>
  12.                 <categoryandroid:name="android.intent.category.LAUNCHER"/>
  13.             </intent-filter>
  14.         </activity>
  15.         <activityandroid:name=".SubActivity"
  16.                   android:label="@string/sub_activity"
  17.                   android:process=":shy.luo.process.sub">
  18.             <intent-filter>
  19.                 <actionandroid:name="shy.luo.task.subactivity"/>
  20.                 <categoryandroid:name="android.intent.categor