上一篇:Android入门(6):活动的生命周期

​ 在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给activity标签指定android:launchMode属性来选择启动模式。

standard

​ standard是活动默认的启动模式,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。我们在ActivityTest项目进行修改FirstActivity:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Log.d(TAG, "onCreate: "+this.toString());    setContentView(R.layout.first_layout);    Button button1 = (Button) findViewById(R.id.button_1);    button1.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(FirstActivity.this, FirstActivity.class);            startActivity(intent);        }    });}

我们点击button1,打印出另一个不同的实例,而且现在需要点击两次Back键才能退出程序。

singleTop

​ 在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会创建新的活动实例。这时需要修改AndroidManifest.xml中FirstActivity的启动模式。

<activity          android:name=".FirstActivity"          android:label="This is FirstActivity"          android:launchMode="singleTop">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    intent-filter>activity>

不过注意的是,当FirstActivity还处于返回栈中但是不是栈顶时,通过另一个活动启动FirstActivity,新的FirstActivity实例还是会被创建。

singleTask

​ 当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

singleInstance (最为复杂)

​ 指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。这样做有什么意义呢?假设我们的程序有一个活动时允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?每个程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈。

修改AndroidManifest.xml:

<activity android:name=".SecondActivity"          android:launchMode="singleInstance">    <intent-filter>        <action android:name="com.example.activitytest.ACTION_START" />        <category android:name="android.intent.category.DEFAULT" />        <category android:name="com.example.activitytest.MY_CATEGORY" />    intent-filter>activity>

修改FirstActivity:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Log.d(TAG, "onCreate: Task id is "+getTaskId());    setContentView(R.layout.first_layout);    Button button1 = (Button) findViewById(R.id.button_1);    button1.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);            startActivity(intent);        }    });}

修改SecondActivity:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Log.d(TAG, "onCreate: Task id is "+getTaskId());    setContentView(R.layout.second_layout);    Button button2 = (Button) findViewById(R.id.button_2);    button2.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);            startActivity(intent);        }    });}

修改ThirdActivity:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Log.d(TAG, "onCreate: Task id is "+getTaskId());    setContentView(R.layout.third_layout);}

其中getTaskId获取当前返回栈的id,我们依次点击button1、button2,打印输出:
然后我们点击Back键返回,发现直接从ThirdActivity直接返回到了FirstActivity,再按下Back又返回到SecondActivity,再按下Back才退出程序。这是为什么呢?其实是因为FirstActivity和ThirdActivity是存放在同一个返回栈里的。

下一篇:Android入门(8):活动的实用小技巧

更多相关文章

  1. Android(安卓)ADB命令大全(通过ADB命令查看wifi密码、MAC地址、
  2. android webview中使用Java调用JavaScript方法并获取返回值
  3. android中隐藏ListView滚动条
  4. android 启动白屏问题完美解决
  5. android activity 跳转与值
  6. android客户端访问服务端tomcat
  7. Android启动另一个App的Service
  8. Android(安卓)Studio 启动安卓模拟器时,报VT-x is disabled in BI
  9. Android(安卓)SurfaceFlinger服务启动过程源码分析1

随机推荐

  1. android源码下载,从Android2.2.2到4.2.2的
  2. android Sqlite多线程访问异常解决方案
  3. Activity横竖屏切换
  4. Android实现图片帮助跳转以及选择重拍Sql
  5. android 发送短信
  6. android 手势监听和多点触摸 笔记
  7. android 通过php 连接 mysql
  8. Android(安卓)双缓冲
  9. android源码编译出现No private recovery
  10. Android进程和线程(Android开发指南--译)