Activity的啟動模式由四種:standard,singleTop,singleTask和singleInstance??梢栽贏ndroidManifest.xml中給activity標簽指定android:launcherMode屬性來選擇啟動模式。
standard是默認的啟動方式,所有的啟動的activity都只存在一個棧當中,并且遵循先進后出的原則。
<activity android:launcherMode:"standard">//默認存在,可加可不加</activity>singleTop:當活動的啟動模式指定為singleTop,在啟動活動時如果發現返回棧頂已經是該活動,則可以直接使用,不會創建新的活動實例。
<activity android:launcherMode:"singleTop"></activity>但是如果有B活動進入了同一個棧,而B活動又可以重新建立之前的A活動的話,這時候A活動會被新建一個實例,這樣也會影響用戶的體驗。也就是說singleTop可以很好的解決重復創建棧頂活動的問題,但是活動沒有處于棧頂的位置還是可能創建多個活動實例。
singleTask:每次啟動A活動時系統先會在返回棧中檢查是否存在A活動的實例,如果沒有發現已經存在則直接使用該實例,并把這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的A活動實例。
<activity android:launcherMode: "singleTask"></activity>singleInstance:設置了該模式的activity會在每次啟動的時候會啟用一個新的返回棧來管理該活動,可以實現共享活動實例的問題:
<activity android:launcherMode:"singleInstance"></activity>主要方法:
getClass().getSimpleName();實現過程代碼: 先創建一個新的BaseActivity,并繼承Activity,在onCreate()中寫入以下代碼:
log.i("TAG", getClass().getSimpleName());然后把各個activity的的繼承關系改為BaseActivity,這樣就相當于每個activity在啟動的時候走先走父類的onCreate方法,執行打印語句,打印出當前的活動名稱。
創建一個新的類:
public class ActivityCollection{ public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void finishActivity(){ for(Activity activity : activities){ if(!activity.isFinishing()){ activity.finish(); } } }}在BaseActivity的onCreate、onDestroy方法中調用addActivity、removeActivity的方法,就是在每次啟動子活動的時候都可以在List添加Activity元素或者殺死一個Activity,若要在某個特定的活動中通過某個特定的方式殺死一個活動則調用finishActivity方法:
ActivityCollection.finishActivity();當一個活動中需要用到一些重要的參數,需要啟動活動的時候必須傳遞進來,那我們最好在需要啟動的活動中添加如下代碼,方便后來者或自己知道要傳入什么類型的參數:
public static void actionActivity(Context context, String data1, String data2){//這里參數不一定是String,根據具體情況而定。 Intent intent = new Intent(context, SecondActivity.class) intent.putExtra("param1", data1); intent.putExtra("param2", data2); context.startActivity(intent);}在啟動需要參數的活動的時候只要調用相應的方法并傳入參數即可:
SecondActivity.actionActivity(FristActivity.this, "data1", "data2");新聞熱點
疑難解答