編輯:關於android開發
終於到了最後一種啟動模式了,指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動(其實如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧);並且該返回棧中只放入這一個活動。
其應用場景是這樣的:假設程序中有一個活動是允許其它程序調用的,如果想使其它程序和這個程序共享這個活動的實例,使用其它三種啟動模式是不行的,因為每個應用程序都有自己的返回棧,同一個活動在不同的返回棧中入棧時必然是創建了新的實例。而使用singleInstance模式可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活動,不管是哪個應用程序來訪問這個活動,都共用同一個返回棧,也解決了共享活動實例的問題。
話不多說,繼續貼代碼。
FirstActivity:
1 public class FirstActivity extends Activity { 2 private Button launch_second; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 requestWindowFeature(Window.FEATURE_NO_TITLE); //隱藏標題欄 7 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 8 WindowManager.LayoutParams.FLAG_FULLSCREEN); //隱藏狀態欄 9 setContentView(R.layout.activity_first); 10 11 launch_second = (Button) findViewById(R.id.launch_second); 12 launch_second.setOnClickListener(new View.OnClickListener() { 13 @Override 14 public void onClick(View v) { 15 Intent intent = new Intent().setClass(FirstActivity.this, SecondActivity.class); 16 startActivity(intent); 17 } 18 }); 19 Log.i("TAG", "FirstActivity is launched; and this stack id is: "+getTaskId()); 20 } 21 22 @Override 23 protected void onDestroy() { 24 super.onDestroy(); 25 Log.i("TAG", "FirstActivity is Destroyed!"); 26 } 27 }
SecondActivity:
1 public class SecondActivity extends Activity { 2 private Button launch_third; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 requestWindowFeature(Window.FEATURE_NO_TITLE); 7 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 8 WindowManager.LayoutParams.FLAG_FULLSCREEN); 9 setContentView(R.layout.activity_second); 10 11 launch_third = (Button) findViewById(R.id.launch_third); 12 launch_third.setOnClickListener(new View.OnClickListener() { 13 @Override 14 public void onClick(View v) { 15 Intent intent = new Intent().setClass(SecondActivity.this, ThirdActivity.class); 16 startActivity(intent); 17 } 18 }); 19 Log.i("TAG", "SecondActivity is launched; and this stack id is: " + getTaskId()); 20 } 21 22 @Override 23 protected void onDestroy() { 24 super.onDestroy(); 25 Log.i("TAG", "SecondActivity is destroyed!"); 26 } 27 }
ThirdActivity:
1 public class ThirdActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 requestWindowFeature(Window.FEATURE_NO_TITLE); 6 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 7 WindowManager.LayoutParams.FLAG_FULLSCREEN); 8 setContentView(R.layout.activity_third); 9 Log.i("TAG", "ThirdActivity is launched; and this stack id is: "+getTaskId()); 10 } 11 12 @Override 13 protected void onDestroy() { 14 super.onDestroy(); 15 Log.i("TAG", "ThirdActivity is destroyed!"); 16 } 17 }
activity_first:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:id="@+id/linearLayout1" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical"> 8 <Button 9 android:id="@+id/launch_second" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:text="啟動SecondActivity!"/> 13 </LinearLayout>
activity_second:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:id="@+id/linearLayout2" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical"> 8 <Button 9 android:id="@+id/launch_third" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:text="啟動ThirdActivity!"/> 13 </LinearLayout>
activity_third:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:id="@+id/linearLayout3" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical"> 8 <TextView 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:text="愛情就像影子,如果踩中了,就請帶走我的心" 12 android:textSize="24sp"/> 13 </LinearLayout>
同樣的,在ManifestAndroid.java文件中。我們需要對上述三個Activity進行注冊,並且將SecondActivity的啟動模式設為SingleInstance,其它兩個默認的Standard即可。相信你對上述的代碼已經不需要注釋就能看懂了!
好了,代碼完成了,那麼就愉快的運行起來吧。首先啟動的是FirstActivity,我們可以看到,它所處的棧是18;點擊"啟動SecondActivity!",此時的SecondActivity啟動,但是它處在的返回棧是19;繼續點擊"啟動ThirdActivity!",可以發現該活動又處在18號的返回棧。因此呢,設置為SingleInstance啟動模式的活動會單獨創建一個返回棧。
然後我們再點擊back鍵,看看其是如何退出程序的。點擊第一次back鍵,顯示的是ThirdActivity首先被銷毀,其次是FirstActivity,最後才是SecondActivity。如果按照前面的模式來說,ThirdActivity是由SecondActivity啟動的,那麼銷毀了ThirdActivity之後不是應該銷毀SecondActivity嗎?怎麼這裡是先銷毀FirstActivity,再銷毀SecondActivity。
其實因為ThirdActivity處在18號棧,當出棧之後,發現該棧中還有Activity在,於是先將該棧中的Activity全部出棧之後,然後在對另一個棧19進行出棧出理。如果我們只啟動FirstActivity和SecondActivity,那麼依舊是SecondActivity先出棧,然後再試FirstActivity。
測試完之後又是對該啟動模式畫示意圖的時刻了,可畫出SingleInstance的原理示意圖如下所示:
Android基礎入門教程——10.14 Android GPS初涉 1.定位相關的一些API 1)LocationManager 官方A
安卓開源項目周報0208,安卓開源項目0208 由OpenDigg 出品的安卓開源項目周報第七期來啦。我們的安卓開源周報集合了OpenDigg一周來
Android可以通過MediaRecorder和AudioRecord這兩個工具來實現錄音,Me
GreenDao3.0新特性解析(配置、注解、加密),greendao3.0新特性Greendao3.0release與7月6日發布,其中最主要的三大改變就是:1.換包名