Activity的启动模式可以通过AndroidManifest.xml文件中的<activity>元素的属性来指定(当然也可以通过代码指定),一共有四种模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

在清单中的指定方法:

<activity android:name="ActivityMain" android:launchMode="singleTask"></activity>

这四种模式又分两类,standard和signleTop属于一类, singleTask和signleInstance属于另一类。

standard和signleTop的共同特点:

  • standard和singleTop属性的 Activity 的实例可以属于任何任务(Task),并且可以位于Activity堆栈的任何位置。
  • 比较典型的一种情况是,一个任务的代码执行startActivity(),如果传递的 Intent 对象没有包含 FLAG_ACTIVITY_NEW_TASK 属性, 指定的 Activity 将被该任务调用,从而装入该任务的Activity 堆栈中。

standard和singleTop的区别在于:

  • standard模式的Activity在被调用时会创建一个新的实例,所有实例处理同一个Intent对象;
  • 但对于singleTop模式的Activity,如果被调用的任务已经有一个这样的Activity 在堆栈的顶端,那么不会有新的实例创建, 任务会使用当前顶端的Activity实例来处理Intent对象,换句话说,如果被调用的任务包含一个不在堆栈顶端的 singleTop Activity, 或者堆栈顶端为 singleTop 的Activity的任务不是当前被调用的任务,那么,仍然会有一个新的Activity对象被创建。

singleTask 和 singleInstance的共同特点:

  • singleTask 和 singleInstance模式的Activity 仅可用于启动任务的情况;
  • 这两种模式的Activity总是处在Activity堆栈的最底端
  • 并且一个任务中只能被实例化一次。

singleTask 和 singleInstance的的区别在于

  • 对于 singleInstance模式的Activity, 任务的Activity堆栈中如果有这样的Activity,那它将是堆栈中的唯一的 Activity, 当前任务收到的 Intent 都由它处理, 由它开启的其他 Activity 将在其他任务中被启动
  • 对于 SingleTask模式的Activity,它在堆栈底端,其上方可以有其他Activity被创建, 但是,如果发给该Activity的Intent对象到来时该Activity不在堆栈顶端,那么该Intent对象将被丢弃,但是界面还是会切换到当前的Activity。

示例:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="belson.android.uECG"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="8" />    <application android:icon="@drawable/ecg_logo" android:label="@string/app_name">        <activity android:name=".splashScreen"           android:label="@string/app_name"          android:launchMode="singleTop"          android:screenOrientation="landscape"          android:configChanges="keyboardHidden|orientation"                                         android:theme="@android:style/Theme.NoTitleBar.Fullscreen">           <!-- landscape设置强制横屏 -->            <!-- Theme.NoTitleBar.Fullscreen设置启动界面无标题全屏 -->           <!-- singleTop模式设置在程序没有运行时 始终从该启动界面的activity做入口运行-->           <!-- 对于singleTop模式的Activity,如果被调用的任务已经有一个这样的Activity 在堆栈的顶端,那么不会有新的实例创建, 任务会使用当前顶端的Activity实例来处理Intent对象,换句话说,如果被调用的任务包含一个不在堆栈顶端的 singleTop Activity, 或者堆栈顶端为 singleTop 的Activity的任务不是当前被调用的任务,那么,仍然会有一个新的Activity对象被创建 -->            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".uECGActivity"           android:launchMode="singleTask"           android:screenOrientation="landscape"           android:configChanges="keyboardHidden|orientation"      android:theme="@android:style/Theme.NoTitleBar.Fullscreen">            <!-- 设置主界面无标题全屏 -->      <!-- android:launchMode="singleInstance" 这里暂时去掉singleInstance模式,因为该模式会导致无法返回预置数据 -->       <!--  SingleTask模式设置 从通知栏里调出当前正在运行的程序时直接跳转到之前的activity 而不重新onCreate程序 -->      <!-- 对于 SingleTask模式的Activity,它在堆栈底端,其上方可以有其他Activity被创建,但是,如果发给该Activity的Intent对象到来时该Activity不在堆栈顶端,那么该Intent对象将被丢弃,但是界面还是会切换到当前的Activity。-->      <!-- 设置keyboardHidden|orientation 这样保证从进入activity始终是横屏 不会出现多次onCreate和onDestroy -->        </activity>                <service android:enabled="true"   android:name=".SocketService">              <intent-filter>                 <action android:name="belson.android.uECG.SocketService" />              </intent-filter>          </service></application>    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> </manifest>

转载自:

http://blog.chinaunix.net/uid-20665441-id-2995070.html

http://www.cnblogs.com/hibraincol/archive/2011/04/11/2012719.html

感谢原作者的慷慨分享~~

更多相关文章

  1. Android——SharedPreferences数据存储
  2. android拨打电话和发送短信核心代码
  3. ViewHolder VS HolderView ?
  4. Android33_Animations使用(一)
  5. Android(安卓)Intent传递对象
  6. @suppresslint 标注忽略指定的警告(HandlerLeak)
  7. 数据存储之SharedPreferences存储——第一行代码Android学习笔记
  8. android用户界面-组件Widget-网络视图WebView
  9. Bundle使用心得

随机推荐

  1. Android timer
  2. 如何在Android平板电脑POWER按钮菜单中添
  3. 【Android】利用adt-bundle在Linux下轻松
  4. android framework 输入事件分析
  5. Android已有项目接入Flutter及互相通信
  6. 【EditText】Android 中设置 EditText 光
  7. 【Android(安卓)Linux内存及性能优化】(
  8. Android中关于SQLite数据库的一些知识
  9. 36个Android开发常用经典代码大全
  10. Android 应用开发中国大学生挑战赛 & 大