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

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


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

  我们可以在AndroidManifest.

  在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       @Override12       public void onClick(View v) {13         //通过显示意图启动SecondActivity14         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       @Override15       public void onClick(View v) {16         //通过显示意图启动SecondActivity17         Intent intent = new Intent().setClass(SecondActivity.this, FirstActivity.class);18         startActivity(intent);19       }20     });21     start_self.setOnClickListener(new View.OnClickListener() {22       @Override23       public void onClick(View v) {24         //通过显示意图启动SecondActivity25         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.:

 1 <??> 2 <LinearLayout ="http://schemas.android.com/apk/res/android" 3   ="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   <Button10     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.:

 1 <??> 2 <LinearLayout ="http://schemas.android.com/apk/res/android" 3   ="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   <Button10     android:id="@+id/start_firstActivity"11     android:layout_width="match_parent"12     android:layout_height="wrap_content"13     android:text="启动第一个Activity!"/>14 15   <Button16     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启动模式的原理示意图如下: