活动的启动模式

活动的启动模式一共有四种,分别是standard、singleTop、singleTask和singleInstance,

可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

standard模式

standard模式是活动默认的启动模式。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,

每次启动都会创建该活动的一个新的实例。

在ActivityTest项目中,修改FirstActivity中onCreate()的方法,代码如下所示:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        Log.d("FirstActivity", this.toString());
        //隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //在活动中加载布局,使用setContentView()方法
        setContentView(R.layout.first_layout);

        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new OnClickListener(){
            public void onClick(View v){

                Intent intent = new Intent(FirstActivity.this,FirstActivity.class);
                startActivity(intent);

            }
        });
    }

上述的代码,在FirstActivity的基础上启动FirstActivity。运行程序,然后在FirstActivity界面连续点击两次按钮,可以看到LogCat打印的信息如下图所示:

从打印的信息中,可以看出每点击一次按钮就会创建一个新的FirstActivity实例。此时返回栈中存在三个FirstActivity的实例,需要连续按三次Back键才会退出程序。

singleTop模式

当活动的启动模式是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>

重新运行程序,查看LogCat的打印信息,如下图所示:

在打印出来的信息中,只有一个FirstActivity的实例,此时无论按几次按钮,都不会有新的打印信息出现。

因为当前FirstActivity已经处于返回栈的栈顶,每当在启动一个FirstActivity时都会直接使用栈顶的活动。

不过当FirstActivity并未处于栈顶位置时,这时再启动FirstActivity,还会创建新的实例。

singleTask模式

在singleTop模式中,如果FirstActivity不在栈顶时,这是如果要启动FirstActivity时还需要创建FirstActivity的实例。

如果只想活动在整个程序上下文中只存在一个实例时,就要使用singleTask模式来实现。

当活动的启动模式指定为singleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,

如果发现存在则直接使用,并把在这个活动之上的所有活动统统出栈;如果发现没有就会创建一个新的活动实例。

修改AndroidManifest.xml中FirstActivity的启动模式,代码如下:

<activity
            android:name=".FirstActivity"
            android:label="this is Firstactivity"
            android:launchMode="singleTask" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

重新运行程序,查看LogCat打印的日志信息,如下图所示:

从打印信息可以看出,在SecondActivity中启动FirstActivity时,会发现返回栈中已经存在一个FirstActivity的实例,

并且在SecondActivity的下面,于是SecondActivity会从返回栈中出栈,而FirstActivity重新成为了栈顶活动,

所以FirstActivity的onStart()方法和SecondActivity的onDestroy()方法会得到执行。

singleInstance模式

指定为singleInstance模式的活动会启动一个新的返回栈来管理这个活动。每个应用程序都会有自己的返回栈,

同一个活动在不同的返回栈中入栈时必然是创建了新的实例。

使用singleInstance模式可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,

不管哪个应用来访问这个活动,都共用同一个返回栈。

修改AndroidManifest.xml文件中SecondActivity的启动模式,代码如下:

<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>

代码中将SecondActivity的启动模式设为singleInstance,然后修改FirstActivity中onCreate()方法的代码,代码如下:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        Log.d("FirstActivity", "Task id is " + getTaskId());
        //隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //在活动中加载布局,使用setContentView()方法
        setContentView(R.layout.first_layout);

        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new OnClickListener(){
            public void onClick(View v){

                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);

            }
        });
    }

在onCreate()方法中打印当前返回栈的id,然后修改SecondActivity中onCreate()方法的代码,代码如下:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.d("SecondActivity", "Task id is " + getTaskId());
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.second_layout);
        Button button2 = (Button)findViewById(R.id.button_2);
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);

                startActivity(intent);

            }
        });

    }

同样在onCreate()方法中打印当前返回栈的id,然后修改按钮点击事件的代码,用于启动ThirdActivity。

最后修改ThirdActivity中onCreate()方法的代码,代码如下:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.d("ThirdActivity", "Task id is " + getTaskId());
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.third_layout);
    }

在onCreate()方法中打印当前返回栈的id。重新运行程序,在FirstActivity界面上点击按钮进入SecondActivity,

然后在SecondActivity界面点击按钮进入ThirdActivity。查看LogCat的打印信息,得到下图所示:

从打印信息中可以看到,SecondActivity的Task id与FirstActivity和ThirdActivity的不相同,

这就说明SecondActivity是放在一个单独的返回栈中。在ThirdActivity界面,按下Back键会直接回到FirstActivity界面,

再按下Back键又会返回到SecondActivity,再按下Back键才会退出程序。

原因是ThirdActivity和FirstActivity在同一个返回栈中,当从ThirdActivity界面按下Back键,

ThirdActivity会从返回栈中出栈,那么FirstActivity就成了栈顶活动而显示在界面上。

然后在FirstActivity界面再次按下Back键,这时当前的返回栈已经空了,于是就显示了另一个返回栈的栈顶活动,即SecondActivity。

Android学习笔记(七)的更多相关文章

  1. android学习笔记七——控件(DatePicker、TimePicker、ProgressBar)

    DatePicker.TimePicker ==> DatePicker,用于选择日期 TimePicker,用于选择时间 两者均派生与FrameLayout,两者在FrameLayout的基础 ...

  2. Android学习笔记七:五大存储

    在Android中,可供选择的存储方式有SharedPreferences.文件存储.SQLite数据库方式.内容提供器(Content provider)和网络. 一.SharedPreferenc ...

  3. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  4. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  5. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

  6. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  7. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

  8. 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常

    目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...

  9. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  10. 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference

    目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...

随机推荐

  1. MVC5 + EF6 入门完整教程二:从前端的UI开始

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...

  2. ios基础篇(十一)——UINavgationController的使用(二)页面切换

    上篇说到了添加UIBarButtonItem,接下来说说界面切换: 1.首先我们在刚才的RootViewController中添加一个按钮用来实现跳转: 打开RootViewController.m( ...

  3. UE3:SkeletalMesh的绘制流程

    [目标] SkeletalMesh的绘制流程 [思路] 1 顶点缓冲流 静态数据流向 动态数据流向(紫红色箭头) 2 FGPUSkinVertexFactory.ShaderDataType.Bone ...

  4. ets查询:查询表中的具体一列的所有值

    比如要查询goods表中的ID这一列的所有值: P = [{#goods{upgrade='$1',_ = '_'},[],['$1']}] 要查询ID和Upgrade这两列的值: P2 = [{#g ...

  5. Servlet路径跳转1---使用相对路径和绝对路径,在页面上调用servlet的路径写法(超链接的方式和表单的方式)

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 index文件 加上/,表 ...

  6. CSS属性之 -- overflow

    overflow可以实现隐藏超出对象内容,同时也有显示与隐藏滚动条的作用,overflow属性有四个值:visible (默认), hidden, scroll, 和auto.同样有两个overflo ...

  7. Android中SQLite下 Cursor的使用。

    引自博客大神一篇文   地址:  http://blog.sina.com.cn/s/blog_15e2abdd90102wcdu.html rawQuery()方法用于执行select语句.  /* ...

  8. HDU 2276

    http://acm.hdu.edu.cn/showproblem.php?pid=2276 矩阵乘法可以解决的一类灯泡开关问题 /* 转移关系为 now left now* 1 0 1 1 1 0 ...

  9. Android 学习第11课,android 实现拨打电话的功能

    1. 先布局界面,界面采用线性垂直方式来布局 在layout 界面文件中 activity_main.xml 中 <LinearLayout xmlns:android="http:/ ...

  10. IPC-管道

    内容提要: 管道简介 使用无名管道实现一个简单的本地文件服务器 使用标准I/O函数库提供的管道实现 使用popen实现本地文件服务器 有名管道-FIFO 使用FIFO改写本地文件服务器 管道和FIFO ...