Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Activity啟動模式之SingleInstance,singleinstance模式

Activity啟動模式之SingleInstance,singleinstance模式

編輯:關於android開發

Activity啟動模式之SingleInstance,singleinstance模式


  終於到了最後一種啟動模式了,指定為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的原理示意圖如下所示:

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved