你的位置:首页 > 操作系统

[操作系统]Activity启动模式之SingleTask


  对于SingleTop模式,即使栈中存在活动的实例,但是如果不在栈顶的位置,系统还是会创建该活动的情况下。如果将启动模式设置为SingleTask模式,那么在启动该活动时,系统检测到栈中存在该活动的实例,就不会再创建该活动了,而只是会将处于该活动上方的所有活动都出栈,使得该活动处于栈顶位置。

  同样的,贴上代码来检测一下。创建项目LearnLaunchMode_SingleTask,其各部分代码如下:

FirstActivity.java:

 1 public class FirstActivity extends ActionBarActivity { 2   private Button launch_second, launch_third; 3   @Override 4   protected void onCreate(Bundle savedInstanceState) { 5     super.onCreate(savedInstanceState); 6     setContentView(R.layout.activity_first); 7  8     launch_second = (Button) findViewById(R.id.launch_second); 9     launch_third = (Button) findViewById(R.id.launch_third);10     launch_second.setOnClickListener(new View.OnClickListener() {11       @Override12       public void onClick(View v) {13         Intent intent = new Intent().setClass(FirstActivity.this, SecondActivity.class);14         startActivity(intent);15       }16     });17     launch_third.setOnClickListener(new View.OnClickListener() {18       @Override19       public void onClick(View v) {20         Intent intent = new Intent().setClass(FirstActivity.this, ThirdActivity.class);21         startActivity(intent);22       }23     });24     Log.i("TAG", this + " is launch");25   }26 27   @Override28   protected void onDestroy() {29     super.onDestroy();30     Log.i("TAG", this + " is destroy!");31   }32 }

SecondActivity.java:

 1 public class SecondActivity extends Activity { 2   private Button launch_first, launch_third; 3   @Override 4   protected void onCreate(Bundle savedInstanceState) { 5     super.onCreate(savedInstanceState); 6     requestWindowFeature(Window.FEATURE_NO_TITLE); 7     setContentView(R.layout.activity_second); 8  9     launch_first = (Button) findViewById(R.id.launch_first);10     launch_third = (Button) findViewById(R.id.launch_third);11     launch_first.setOnClickListener(new View.OnClickListener() {12       @Override13       public void onClick(View v) {14         Intent intent = new Intent().setClass(SecondActivity.this, FirstActivity.class);15         startActivity(intent);16       }17     });18     launch_third.setOnClickListener(new View.OnClickListener() {19       @Override20       public void onClick(View v) {21         Intent intent = new Intent().setClass(SecondActivity.this, ThirdActivity.class);22         startActivity(intent);23       }24     });25     Log.i("TAG", this + " is launch");26   }27 28   @Override29   protected void onDestroy() {30     super.onDestroy();31     Log.i("TAG", this + " is destroy!");32   }33 }

ThirdActivity.java:

 1 public class ThirdActivity extends Activity { 2   private Button launch_first, launch_second; 3   @Override 4   protected void onCreate(Bundle savedInstanceState) { 5     super.onCreate(savedInstanceState); 6     requestWindowFeature(Window.FEATURE_NO_TITLE); 7     setContentView(R.layout.activity_third); 8  9     launch_first = (Button) findViewById(R.id.launch_first);10     launch_second = (Button) findViewById(R.id.launch_second);11     launch_first.setOnClickListener(new View.OnClickListener() {12       @Override13       public void onClick(View v) {14         Intent intent = new Intent().setClass(ThirdActivity.this, FirstActivity.class);15         startActivity(intent);16       }17     });18     launch_second.setOnClickListener(new View.OnClickListener() {19       @Override20       public void onClick(View v) {21         Intent intent = new Intent().setClass(ThirdActivity.this, SecondActivity.class);22         startActivity(intent);23       }24     });25     Log.i("TAG", this + " is launch");26   }27 28   @Override29   protected void onDestroy() {30     super.onDestroy();31     Log.i("TAG", this + " is destroy!");32   }33 }

activity_first.:

 1 <??> 2 <LinearLayout 3   ="http://schemas.android.com/apk/res/android" 4   android:layout_width="match_parent" 5   android:layout_height="match_parent" 6   android:orientation="vertical"> 7   <Button 8     android:id="@+id/launch_second" 9     android:layout_width="match_parent"10     android:layout_height="wrap_content"11     android:text="启动第二个Activity!" />12   <Button13     android:id="@+id/launch_third"14     android:layout_width="match_parent"15     android:layout_height="wrap_content"16     android:text="启动第三个Activity!" />17 </LinearLayout>

activity_second.:

 1 <??> 2 <LinearLayout 3   ="http://schemas.android.com/apk/res/android" 4   android:layout_width="match_parent" 5   android:layout_height="match_parent" 6   android:orientation="vertical"> 7   <Button 8     android:id="@+id/launch_first" 9     android:layout_width="match_parent"10     android:layout_height="wrap_content"11     android:text="启动第一个Activity!" />12   <Button13     android:id="@+id/launch_third"14     android:layout_width="match_parent"15     android:layout_height="wrap_content"16     android:text="启动第三个Activity!" />17 </LinearLayout>

activity_third.:

 1 <??> 2 <LinearLayout 3   ="http://schemas.android.com/apk/res/android" 4   android:layout_width="match_parent" 5   android:layout_height="match_parent" 6   android:orientation="vertical"> 7   <Button 8     android:id="@+id/launch_first" 9     android:layout_width="match_parent"10     android:layout_height="wrap_content"11     android:text="启动第一个Activity!" />12   <Button13     android:id="@+id/launch_second"14     android:layout_width="match_parent"15     android:layout_height="wrap_content"16     android:text="启动第二个Activity!" />17 </LinearLayout>

  同样,还需要在AndroidManifest.java中对SecondActivity以及ThirdActivity两个活动进行注册,并设置上述三个活动的启动模式为SingleTask:

 1 <activity 2   android:name=".FirstActivity" 3   android:launchMode="singleTask" 4   android:label="@string/app_name"> 5   <intent-filter> 6     <action android:name="android.intent.action.MAIN" /> 7     <category android:name="android.intent.category.LAUNCHER" /> 8   </intent-filter> 9 </activity>10 <activity android:name=".SecondActivity" android:launchMode="singleTask" />11 <activity android:name=".ThirdActivity" android:launchMode="singleTask" />

  在该程序中,系统先启动FirstActivity,此时打印信息显示该活动启动了;然后我们点击"启动第二个Activity!"按钮,可以看到显示信息中SecondActivity is launch;再点击"启动第三个Activity!",也可以看到第三个活动启动了。最后再点击"启动第一个Activity!"。从时观察打印信息可以看到;SecondActivity is destroy;以及ThirdActivity is destroy。表示此时SecondActivity与ThirdActivity都已出栈。现在只需要按一次back键即可退出程序。其他的各种创建活动的顺序就不再做演示了。

 

  综上所述,可以画出该启动模式的原理示意图如下: