Activity的啟動分為兩種方式,顯示方式和隱式方式,顯示方式就是在通過intent啟動Activity時指定了Activity的包名和類名,
而隱式方式則在初始化Intent時只指定action或action和data屬性。接下來將來總結顯示啟動和隱式啟動的方式和注意事項。
1、Activity的顯示啟動:通過包名來啟動(不管是啟動自己應用的Activity還是啟動其他應用的Activity)
1.1 ComponentName對象的方式
ComponentName cn = new ComponentName("com.example.ipc_activity",
"com.example.ipc_activity.ActivityA") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
1.2 初始化Intent時指定包名
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("com.example.ipc_activity",
"com.example.ipc_activity.ActivityA");
startActivity(intent);
2、Activity的隱式啟動:通過指定Action或Action和Data屬性啟動Activity,如果有多個Activity符合這個啟動條件,系統會讓用戶選擇啟動那個應用。
2.1 只為被啟動Activity指定Action的屬性。在AndroidManifest.xml文件中為待被啟動的Activity標簽指定Action屬性。如下:
Activity標簽中定義的屬性:
android:name="com.example.ipc_activity.ActivityB"
android:label="@string/app_name" >
其中
是隱式啟動Activity必須的屬性。
隱式啟動代碼:
Intent intent = new Intent("dxd.ipcdemo.activity.DEMO") ;
startActivity(intent) ;
2.2 為被啟動的Activity指定Action和Data屬性。如下:
android:name="com.example.ipc_activity.ActivityB"
android:label="@string/app_name" >
同樣
也是比須的。
隱式啟動代碼:
Intent intent = new Intent("dxd.ipcdemo.activity.DXD",Uri.parse("info://")) ;
startActivity(intent) ;
比較一下,可以總結得到如下兩條結論:
A:隱式啟動Activity必須為目標Activity指定DEFAULT屬性
B:如果指定了
屬性,在啟動的時候必須加上data屬性,不然會報錯。
3、Android裡面啟動Activity都可以用前面兩種方式,不管是本應用的Activity還是另外程序的Activity都可以得以解決。但是如果是啟動
自己應用的Activity的話,就沒有必要這麼麻煩了,直接通過指定Activity.class即可。方式如下:
Intent intent = new Intent(ActivityA.this ,ActivityB.class) ;
startActivity(intent) ;
4、通過包名啟動apk
Intent intent = getPackageManager().getLaunchIntentForPackage
("com.example.ipc_activityb") ;
if(intent != null)
startActivity(intent) ;
附加1:這是Android裡面啟動Activity的方式,除此之外啟動Activity還有4種啟動模式,在Activity標簽中配置launch_mode即可。
1. standard
模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。
2. singleTop
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實
例,只要不在棧頂,都會創建實例)。
3. singleTask
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的
實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
4. singleInstance
在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何
應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應
用中。
附加2:有時項目中需要這樣的需求,透明加載Activity。比如在ActivityA裡啟動ActivityB,要求ActivityB不顯示,但是要執行ActivityB裡
的代碼,這時就需要為ActivityB指定style為
setTheme(android.R.style.Theme_NoDisplay) ; 也可以在Activity的標簽中指定style屬性android:theme="@android:style/Theme.NoDisplay"即可。