Activity启动模式之SingleTask

时间:2021-12-28 20:41:51

  对于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             @Override
12             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             @Override
19             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     @Override
28     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             @Override
13             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             @Override
20             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     @Override
29     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             @Override
13             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             @Override
20             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     @Override
29     protected void onDestroy() {
30         super.onDestroy();
31         Log.i("TAG", this + " is destroy!");
32     }
33 }

activity_first.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="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     <Button
13         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.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="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     <Button
13         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.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="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     <Button
13         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。表示此时SecondActivityThirdActivity都已出栈。现在只需要按一次back键即可退出程序。其他的各种创建活动的顺序就不再做演示了。

Activity启动模式之SingleTask 

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

Activity启动模式之SingleTask