码迷,mamicode.com
首页 > 其他好文 > 详细

Activity启动模式之SingleTop

时间:2016-08-22 20:03:39      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

  当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。当然,如果它不是处于栈顶的位置,那么系统依旧会再创建一个该活动的实例。

  我们可以在AndroidManifest.xml文件中进行启动模式的设置;在<activity>标签中添加android:launchModed的属性,其属性值设置为SingleTop即可。

  在AS中创建项目LearnLaunchMode_SingleTop,其各部分代码如下:

FirstActivity.java:

 1 public class FirstActivity extends ActionBarActivity {
 2     private Button start_secondActivity;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         requestWindowFeature(Window.FEATURE_NO_TITLE);
 7         setContentView(R.layout.activity_first);
 8         //获取Button组件
 9         start_secondActivity = (Button) findViewById(R.id.start_secondActivity);
10         start_secondActivity.setOnClickListener(new View.OnClickListener() {
11             @Override
12             public void onClick(View v) {
13                 //通过显示意图启动SecondActivity
14                 Intent intent = new Intent().setClass(FirstActivity.this, SecondActivity.class);
15                 startActivity(intent);
16             }
17         });
18         Log.i("TAG", this + " is launch");
19     }
20 }

SecondActivity.java

 1 public class SecondActivity extends Activity {
 2 
 3     private Button start_firstActivity, start_self;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         requestWindowFeature(Window.FEATURE_NO_TITLE);
 8         setContentView(R.layout.activity_second);
 9         //获取Button组件
10         start_firstActivity = (Button) findViewById(R.id.start_firstActivity);
11         start_self = (Button) findViewById(R.id.start_self);
12         //以匿名类的形式为Button组件设置事件监听器
13         start_firstActivity.setOnClickListener(new View.OnClickListener() {
14             @Override
15             public void onClick(View v) {
16                 //通过显示意图启动SecondActivity
17                 Intent intent = new Intent().setClass(SecondActivity.this, FirstActivity.class);
18                 startActivity(intent);
19             }
20         });
21         start_self.setOnClickListener(new View.OnClickListener() {
22             @Override
23             public void onClick(View v) {
24                 //通过显示意图启动SecondActivity
25                 Intent intent = new Intent().setClass(SecondActivity.this, SecondActivity.class);
26                 startActivity(intent);
27             }
28         });
29         Log.i("TAG", this + " is launch");
30     }
31 }

activity_first.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context=".FirstActivity">
 8 
 9     <Button
10         android:id="@+id/start_secondActivity"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:text="启动第二个Activity!"/>
14 
15 </LinearLayout>

Activity_second.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context=".SecondActivity">
 8 
 9     <Button
10         android:id="@+id/start_firstActivity"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:text="启动第一个Activity!"/>
14 
15     <Button
16         android:id="@+id/start_self"
17         android:layout_width="match_parent"
18         android:layout_height="wrap_content"
19         android:text="启动本身第二个Activity!"/>
20 
21 </LinearLayout>

  另外,别忘了在AndroidManifest.java文件中注册SecondActivity以及为两个活动设置启动模式为SingleTop:

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

  在代码中,我们实现以FirstActivity启动SecondActivity,此时SecondActivity位于栈顶,然后再以SecondActivity来打开自己,如果是Standard模式,那么会另外再创建SecondActivity的实例,但是在SingleTop的模式下,就只会创建一次该活动实例。(PS:在SecondActivity界面时,点击了很多次的"启动本身第二个Activity!"的按钮)

技术分享 

  同样,我们还可以在SecondActivity界面点击"启动第一个Activity!"的按钮,虽然栈中已经存在了FirstActivity,但是它并非位于栈顶,所以还是会继续创建FirstActivity的实例。

技术分享 

  虽然点击了很多次"启动本身第二个Activity!"的按钮,但因为在栈中只创建一个SecondActivity的实例,所以只需要按一次back键就可以将SecondActivity出栈。

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

技术分享

 

 

Activity启动模式之SingleTop

标签:

原文地址:http://www.cnblogs.com/rocking7189/p/5796671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!