>[info] 一個名稱為Activity的Android應用程序,它由三個Activity組件**MainActivity** 、**SubActivitylnProcess**和**SubActivitylnNewProcess**組成,其中, **MainActivity**是**根Activity**, **SubActivitylnProcess**和**SubActivitylnNew Process**是**子Activity**。**SubActivitylnProcess與MainActivity運行在同一個進程中,而SubActivitylnNewProcess運行在一個獨立的進程中。**
應用程序Activity的目錄結構如下:
~~~
~/Android/ packages /experimenta l /Activity
----AndroidManifest . xml
----Android.mk
----src
-- - shy/luo/activity
----MainActi vi ty . java
- -- SubActivityinProcess .java
---- SubActi vi tyinNewProcess. java
----res
----layout
-main xml
---- sub.xml
-一-- values
---- strings. xml
----drawable
----icon png
~~~
### 各個文件的內容
#### 清單文件AndroidManifest
**AndroidManifest.xml**
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="shy.luo.activity"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:process="shy.luo.activity.mainprocess">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="@string/sub_activity"
android:name=".SubActivityInProcess"
android:process="shy.luo.activity.mainprocess">
<intent-filter>
<action android:name="shy.luo.activity.subactivity.in.process"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:label="@string/sub_activity"
android:name=".SubActivityInNewProcess"
android:process="shy.luo.activity.newprocess">
<intent-filter>
<action android:name="shy.luo.activity.subactivity.in.new.process"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
~~~
這是應用程序Activity 的配置文件。由于在程序中使用到了三個Activity組件MainActivity 、SubActivitylnProcess和SubActivitylnNewProcess ,因此,我們就需要在這里對它們進行配置。
> 我們將MainActivity組件的**Action名稱和Category名稱分別設置為“android.intent.action.MAIN”和“android.intent. category. LAUNCHER”,使得它可以作為應用程序Activity的根Activity組件**。同時,我們將**SubActivitylnProcess**組件和**SubActivitylnNewProcess**組件的**Action名稱**分別設置為**自定義值“shy.luo.activity.subactivity.in.process”和“shy.luo.activity.subactivity.in.new.process”**,因此,可以通過這兩個名稱來**隱式地啟動它們**。此外,我們還將Main.Activity紐件和SubActivityinProcess組件的**android:process屬性**設置為“**shy.luo.activity.mainprocess**”,以使它們可以**運行在同一個進程**中;而將**SubActivityinNewProcess組件的android: process屬性設置為“shy.luo.activity.newprocess",以使它可以運行在另外一個進程中。**
#### MainActivity
MainActivity是應用程序Activity的根Activity組件,它的用戶界面上有兩個按鈕,分別用來啟動
SuhActivitylnProcess和SuhActivitylnNewProcess這兩個子Activity。SuhActivitylnProcess和S由ActivitylnNewProcess的
組件名稱分別被配置為“shy.luo.activity.SubActivityInProcess”和“shy.luo.activity.SubActivityInNewProcess”,
因此,第35行和第38行調用成員函數startActivity啟動它們時,只需要分別指定這兩個名稱即可,而不需要知道它們是由哪一個類來實現的。
**MainActivity.java**
~~~
public class MainActivity extends Activity implements OnClickListener {
private final static String LOG_TAG = "shy.luo.activity.MainActivity";
private Button startInProcessButton = null;
private Button startInNewProcessButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startInProcessButton = (Button)findViewById(R.id.button_start_in_process);
startInNewProcessButton = (Button)findViewById(R.id.button_start_in_new_process);
startInProcessButton.setOnClickListener(this);
startInNewProcessButton.setOnClickListener(this);
Log.i(LOG_TAG, "Main Activity Created.");
}
@Override
public void onClick(View v) {
if(v.equals(startInProcessButton)) {
Intent intent = new Intent("shy.luo.activity.subactivity.in.process");
startActivity(intent);
} else if(v.equals(startInNewProcessButton)) {
Intent intent = new Intent("shy.luo.activity.subactivity.in.new.process");
startActivity(intent);
}
}
}
~~~
對應的布局文件**main.xml**
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<Button
android:id="@+id/button_start_in_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/start_in_process" >
</Button>
<Button
android:id="@+id/button_start_in_new_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/start_in_new_process" >
</Button>
</LinearLayout>
~~~
**SubActivityInProcess.java**
SubActivityInProcess是應用程序Activity 的一個子Activ即組件,它是由MainActivity組件啟動起來的,當我們點擊它的用戶界面上的一個finish按鈕時,就可以返回到MainActivity組件中。
~~~
public class SubActivityInProcess extends Activity implements OnClickListener {
private final static String LOG_TAG = "shy.luo.activity.SubActivityInProcess";
private Button finishButton = null;
@Override
public void 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 In Process Created.");
}
@Override
public void onClick(View v) {
if(v.equals(finishButton)) {
finish();
}
}
}
~~~
**SubActivityInProcess**組件和**SubActivityInNewProcess**組件對應的布局文件**sub.xml**
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<Button
android:id="@+id/button_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/finish" >
</Button>
</LinearLayout>
~~~
這是SubActivitylnProcess組件和SubActivitylnNewProcess組件的界面配置文件,它在屏幕中間顯示一個按鈕。
**SubActivityInNewProcess.java**
SubActivitylnNewProcess是應用程序Activity的另外一個子Activity組件,它也是由MainActivity組件啟動起來的,不過它是在一個新的進程中啟動的,當我們點擊它的用戶界面的finish按鈕時,同樣可以返回到MainActivity組件中。
~~~
public class SubActivityInNewProcess extends Activity implements OnClickListener {
private final static String LOG_TAG = "shy.luo.activity.SubActivityInNewProcess";
private Button finishButton = null;
@Override
public void 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 In New Process Created.");
}
@Override
public void onClick(View v) {
if(v.equals(finishButton)) {
finish();
}
}
}
~~~
- 第一章 準備知識
- 第二章 硬件抽象層
- 第三章 智能指針
- 第四章 Logger日志系統
- 第五章 Binder進程間通信系統
- 第六章 Ashmem匿名共享內存系統
- 第七章 Activity組件的啟動過程
- 7.1 Activity組件應用實例
- 7.2 根Activity組件的啟動過程
- 第八章 Service組件的啟動過程
- 第九章 Android系統廣播機制
- 第十章 Content Provider組件的實現原理
- 第十一章 Zygote和System進程的啟動過程
- 第十二章 Android應用程序進程的啟動過程
- 第十三章 Android應用程序的消息處理機制
- 第十四章 Android應用程序的鍵盤消息處理機制
- 第十五章 Android應用程序線程的消息循環模型
- 第十六章 Android應用程序的安裝和顯示過程
- 16.1 Android應用程序的安裝過程
- 16.2 Android應用程序的顯示過程