Android原始碼解析之應用程式在新的程序中啟動新的Activity的方法和過程分析
轉載自:http://blog.csdn.net/luoshengyang/article/details/6720261
前面我們在分析Activity啟動過程的時候,看到同一個應用程式的Activity一般都是在同一個程序中啟動,事實上,Activity也可以像Service一樣在新的程序中啟動,這樣,一個應用程式就可以跨越好幾個程序了,本文就分析一下在新的程序中啟動Activity的方法和過程。
在前面Android程序間通訊(IPC)機制Binder簡要介紹和學習計劃一文中,我們提到,在Android系統中,每一個應用程式都是由一些Activity和Service組成的,一般Service執行在獨立的程序中,而Activity有可能執行在同一個程序中,也有可能執行在不同的程序中。在前面
老規矩,我們通過例子來介紹Android應用程式在新的程序中啟動新的Activity的方法以及分析其過程。首先在Android原始碼工程中建立一個Android應用程式工程,名字就稱為Process吧。關於如何獲得Android原始碼工程,請參考
應用程式的預設Activity定義在src/shy/luo/process/MainActivity.java檔案中:
-
package shy.luo.process;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- publicclass MainActivity extends Activity implements OnClickListener {
- privatefinalstatic String LOG_TAG = "shy.luo.process.MainActivity";
- private Button startButton = null;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- startButton = (Button)findViewById(R.id.button_start);
- startButton.setOnClickListener(this);
- Log.i(LOG_TAG, "Main Activity Created.");
- }
- @Override
- publicvoid onClick(View v) {
- if(v.equals(startButton)) {
- Intent intent = new Intent("shy.luo.process.subactivity");
- startActivity(intent);
- }
- }
- }
名字為“shy.luo.process.subactivity”的Actvity實現在src/shy/luo/process/SubActivity.java檔案中:
- package shy.luo.process;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- publicclass SubActivity extends Activity implements OnClickListener {
- privatefinalstatic String LOG_TAG = "shy.luo.process.SubActivity";
- private Button finishButton = null;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.sub);
- finishButton = (Button)findViewById(R.id.button_finish);
- finishButton.setOnClickListener(this);
- Log.i(LOG_TAG, "Sub Activity Created.");
- }
- @Override
- publicvoid onClick(View v) {
- if(v.equals(finishButton)) {
- finish();
- }
- }
- }
再來重點看一下應用程式的配置檔案AndroidManifest.xml:
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="shy.luo.task"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".MainActivity"
- android:label="@string/app_name">
- android:process=":shy.luo.process.main"
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activityandroid:name=".SubActivity"
- android:label="@string/sub_activity"
- android:process=":shy.luo.process.sub">
- <intent-filter>
- <actionandroid:name="shy.luo.task.subactivity"/>
- <categoryandroid:name="android.intent.categor