(Android第一行代码)活动的启动模式
活動的啟動模式
啟動模式一共有四種,分別是 standard、singleTop、 singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通過給<activity>標簽指定 android:launchMode屬性來選擇啟動模式。下面我們來逐個進行學習。
1.standard模式:(對于使用 standard 模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會創建 該活動的一個新的實例。)
??是活動默認的啟動模式
?修改 FirstActivity中 onCreate()方法的代碼,如下所示:
?????????????? @Override
??? ?protected void onCreate(Bundle savedInstanceState) {?
?????????? ?super.onCreate(savedInstanceState);?
??????????//從打印信息中我們就可以看出,每點擊一次按鈕就會創建出一個新的 FirstActivity實例我們需要按三次back才能退出程序。
?????????? ?Log.d("FirstActivity", this.toString());?
????????????requestWindowFeature(Window.FEATURE_NO_TITLE);?
???????? ? ?setContentView(R.layout.first_layout);?
?????????? ?Button button1 = (Button) findViewById(R.id.button_1);
?????????? button1.setOnClickListener(new OnClickListener() {?
????????????? ?@Override
??????????public void onClick(View v) {?
???????????? //我們,在 FirstActivity的基礎上啟動 FirstActivity。
?????????????????? ?Intent intent = new Intent(FirstActivity.this, FirstActivity.class);??
??????????????????? startActivity(intent);
??????????? ?}
?????????? });
???? }
2.singleTop模式(在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用 它,不會再創建新的活動實例。)
?????? 修改 AndroidManifest.xml中 FirstActivity的啟動模式,
??????? <activity????
???????????? ?android:name=".FirstActivity"
?????????? //修改 AndroidManifest.xml中 FirstActivity的啟動模式,
??????????? ? android:launchMode="singleTop"?
??????????? ?android:label="This is FirstActivity" >?
?????????? ? <intent-filter>????
?????????????? ? <action android:name="android.intent.action.MAIN" />?
?????????????? ? <category android:name="android.intent.category.LAUNCHER" />?
?????????????</intent-filter>
????? </activity>
?然后重新運行程序,查看 LogCat會看到已經創建了一個 FirstActivity的實例.僅按一次 Back鍵就可以退出程序。不過當 FirstActivity并未處于棧頂位置時,這時再啟動 FirstActivity,還是會創建新的實 例的。
3.singleTask模式(當活動的啟動模式指定為 singleTask,每次啟動該活動時系統首先 會在返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,并把在這 個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。)
- ?修改 AndroidManifest.xml中 FirstActivity的 啟動模式
????? <activity??
?????????????? android:name=".FirstActivity"
??????? //修改 AndroidManifest.xml中 FirstActivity的 啟動模式
???????????? ? android:launchMode="singleTask"?
?????????????? android:label="This is FirstActivity" >???
???????? ?<intent-filter>???????
????????????? ?<action android:name="android.intent.action.MAIN" />??????
????????????? ?<category android:name="android.intent.category.LAUNCHER" />?
??????? </intent-filter>
?????</activity>
- ??? 然后在 FirstActivity中添加 onRestart()方法,并打印日志:
???? ?@Override
???????protected void onRestart() {?
??????????? ?super.onRestart();?
?????????????Log.d("FirstActivity", "onRestart");
?? }
- ? 最后在 SecondActivity中添加 onDestroy()方法,并打印日志:
?????? @Override protected void onDestroy() {?
??????????????????? super.onDestroy();
?????????? ? Log.d("SecondActivity", "onDestroy");
?? }
在 SecondActivity 中啟動 FirstActivity 時,會發 現返回棧中已經存在一個 FirstActivity 的實例,并且是在 SecondActivity 的下面,于是 SecondActivity 會從返回棧中出棧,而 FirstActivity 重新成為了棧頂活動,因此 FirstActivity 的 onRestart()方法和 SecondActivity的 onDestroy()方法會得到執行。
4.singleInstance模式(指定為 singleInstance模式的活動會啟用一 個新的返回棧來管理這個活動)
?????使用場景:假設我們的程序中有一個 活動是允許其他程序調用的,如果我們想實現其他程序和我們的程序可以共享這個活動的實例。?使用前面三種啟動模式肯定是做不到的,因為每個??? 應用程序都會有自 己的返回棧,同一個活動在不同的返回棧中入棧時必然是創建了新的實例。而使用 singleInstance模式就可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活 動,不管是哪個應用程序來訪問這個活動,都共用的同一個返回棧。
- 修改 AndroidManifest. xml中 SecondActivity的啟動模式:
???????? <activity?
?????????????? android:name=".SecondActivity"?
???????? //修改 AndroidManifest. xml中 SecondActivity的啟動模式:
????????????? ?android:launchMode="singleInstance" >??
???????????? ?<intent-filter>??
?????????????????? ?<action android:name="com.example.activitytest.ACTION_START" />????
????????????????????<category android:name="android.intent.category.DEFAULT" />?????
????????????????? ? <category android:name="com.example.activitytest.MY_CATEGORY" />?
?????????? ??????? ?</intent-filter>
???????????? </activity>
- ???? 修改 FirstActivity 中 onCreate()方法的代碼,在 onCreate()方法中打印了當前返回棧的 id.
?????????????? Log.d("FirstActivity", "Task id is " + getTaskId());
- ???? 修改 SecondActivity中 onCreate()方法 的代碼,打印了當前返回棧的 id.
?????????? ???? Log.d("SecondActivity", "Task id is " + getTaskId());
- ???? 最后修改 ThirdActivity中 onCreate()方法仍然是在 onCreate()方法中打印了當前返回棧的 id.
??????????? ?????Log.d("ThirdActivity", "Task id is " + getTaskId());
??????打印結果:
?可以看到,SecondActivity 的 Task id 不同于 FirstActivity 和 ThirdActivity,這說明 SecondActivity確實是存放在一個單獨的返回棧里的,而且這個棧中只有 SecondActivity這一 個活動。
???
???????
???
??
?????
??
轉載于:https://www.cnblogs.com/weichenji/p/6102979.html
總結
以上是生活随笔為你收集整理的(Android第一行代码)活动的启动模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钟国晨160809323 (作业9)
- 下一篇: hdu 2602 Bone Collec