------siwuxie095

共4种启动模式:standard singleTop singleTask singleInstance

1、标准启动模式(standard) 也即默认的启动模式

(1)先创建一个项目:LaunchMode,选择API:21 Android 5.0

选择Empty Activity,工程结构目录一览:

(2) 先修改 activity_main.xml 的布局为LinearLayout,添加 orientation 属性为:vertical

修改TextView的 id 为 tv,添加一个Button,给Button添加一个 textAllCaps 属性为:false

(关闭全部大写)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:orientation="vertical"

tools:context="com.siwuxie095.launchmode.MainActivity">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!"

android:id="@+id/tv"/>

<Button

android:textAllCaps="false"

android:text="启动MainActivity"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/btnStartSelf" />

</LinearLayout>

(3)MainActivity.java 中,呈现任务栈ID和当前Activity的ID

package com.siwuxie095.launchmode;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private TextView tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//需要执行强制类型转换

tv= (TextView) findViewById(R.id.tv);

//设置TextView的呈现信息

//任务栈ID 和当前Activity的ID(即Activity实例的ID)

//任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例

//呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航

tv.setText(String.format("TaskId:\n%d \nCurrentActivityId:\n%s",getTaskId(),toString()));

findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//从MainActivity启动自身

startActivity(new Intent(MainActivity.this, MainActivity.class));

}

});

}

}

(4)在 AndroidManifest.xml 中设置启动模式,如果没有设置,

即为默认启动模式---标准启动模式

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.siwuxie095.launchmode">

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<activity android:name=".MainActivity"

android:launchMode="standard">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

(5)连续两次点击按钮,发现TaskId不变,而CurrentActivityId变了,

点击一次返回,回到上一个Activity实例,点击三次返回后结束程序

回到桌面,运行一览:

2、singleTop启动模式

(1)直接修改 AndroidManifest.xml 的启动模式为 singleTop

android:launchMode="singleTop"

(2)运行后,点击"启动MainActivity",发现TaskId和CurrentActivityId都没有变化,

点击返回直接结束程序回到桌面,看似Activity只能启动一次,一览:

(3)再new一个Empty Activity:BAty,此时工程结构目录一览:

(4)在 AndroidManifest.xml 中,同样将

BAty启动模式设置为 singleTop,为 activity_main.xml 添加一个Button

用于启动BAty,将activity_main.xml完全复制到activity_baty.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:orientation="vertical"

tools:context="com.siwuxie095.launchmode.MainActivity">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!"

android:id="@+id/tv"/>

<Button

android:textAllCaps="false"

android:text="启动MainActivity"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/btnStartSelf" />

<Button

android:textAllCaps="false"

android:text="启动B Activity"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/btnStartBAty" />

</LinearLayout>

(5)同样,在MainActivity.java中做略微修改,复制到Baty.java中,再做略微修改

MainActivity.java:

package com.siwuxie095.launchmode;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private TextView tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//需要执行强制类型转换

tv= (TextView) findViewById(R.id.tv);

//设置TextView的呈现信息

//任务栈ID 和当前Activity的ID(即Activity实例的ID)

//任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例

//呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航

tv.setText(String.format("A:\nTaskId:\n%d \nCurrentActivityId:\n%s",getTaskId(),toString()));

findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//从MainActivity启动自身

startActivity(new Intent(MainActivity.this, MainActivity.class));

}

});

findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(MainActivity.this, BAty.class));

}

});

}

}

BAty.java:

package com.siwuxie095.launchmode;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class BAty extends AppCompatActivity {

private TextView tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_baty);

//需要执行一个强制类型转换

tv= (TextView) findViewById(R.id.tv);

tv.setText(String.format("B:\nTaskId:\n%d \nCurrentActivityId:\n%s",getTaskId(),toString()));

findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(BAty.this, MainActivity.class));

}

});

findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//从BAty启动自身

startActivity(new Intent(BAty.this, BAty.class));

}

});

}

}

(6)运行后发现,只点击"启动MainActivity",任务栈和实例的ID依然没有变化,

此时点击"启动B Activity",再点击"启动MainActivity",任务栈没变,但实例ID已经变了

(点击三次返回才会结束程序回到桌面)

即:在同一个栈中,指明启动模式为singleTop,若一个Activity处于栈顶,那么只能创建一个实例

,若不处于栈顶才会创建新的实例,一览:

3、singleTask启动模式

(1)先修改 AndroidManifest.xml 中的 launchMode 为 singleTask,直接运行,

只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",再点击

"启动MainActivity",任务栈和实例ID依然没有变,点击一次返回就结束程序回到桌面,

即此时任务栈中只剩下了MainActivity,BAty已经在最后一次点击"启动MainActivity"时

就被弹出任务栈,一览:

4、singleInstance启动模式

(1)先修改 AndroidManifest.xml 中的 launchMode 为 singleInstance,直接运行,

只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",TaskId 加1,

即任务栈和实例ID都变了,再点击"启动MainActivity",又回到第一次启动MainActivity时的

任务栈和实例ID,即没变,再点击"启动B Activity",同样回到第一次启动BAty时的任务栈和

实例ID,也没变,即独立的任务栈只放一个实例,一览:

【made by siwuxie095】

Activity启动模式的更多相关文章

  1. Activity启动模式 及 Intent Flags 与 栈 的关联分析

     http://blog.csdn.net/vipzjyno1/article/details/25463457    Android启动模式Flags栈Task   目录(?)[+] 什么是栈 栈 ...

  2. 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析

    http://blog.csdn.net/vipzjyno1/article/details/25463457    在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...

  3. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  4. Android-3 Activity启动模式

    Activity启动模式 android:launchMode="singleTask" * Standard 每次都创建一个新实例 -- TaskID不变,ActivityID改 ...

  5. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  6. Activity 启动模式 FLAG

    原文:https://blog.csdn.net/youhongyan/article/details/64151922 一.Activity启动模式的设置在AndroidManifest.xml文件 ...

  7. 【转】Android总结篇系列:Activity启动模式(lauchMode)

    [转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...

  8. Activity启动模式(lauchMode)

    Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址 ...

  9. AndroidのActivity启动模式

    Activity启动模式      .概念      Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否    .属性     Activity的启 ...

  10. activity启动模式之singleInstance

    activity启动模式之singleInstance 一.简介 Log.d("C2", getTaskId()+"");里面的getTaskId()可以获取a ...

随机推荐

  1. Python-10 字典

    #1 创建 dict1={'欢欢':'i love','小高高':'you'} dict2={1:'one',2:'two',3:'three'} dict3={} #2 访问元素 print('欢欢 ...

  2. R语言向量

    R语言基础:向量  心无咎 2012-04-02 13:37:00 向量(vector)1.seq():产生有规律的数列,间距省略时默认值为1.        例1:seq(10, 20, 0.5)  ...

  3. C#编写WIN32系统托盘程序

    基本功能概述: 程序运行后驻留系统托盘,左键呼出,右键退出.后续可加右键菜单. 注册系统案件WIN+F10,呼出程序. 重写系统消息,最小化和关闭按钮隐藏程序 using System; using ...

  4. NOIP模拟赛-征兵

    一个国王,他拥有一个国家.最近他因为国库里钱太多了,要征集一只部队要保卫国家.他选定了N个女兵和M个男兵,但事实上每征集一个兵他就要花10000RMB,即使国库里钱再多也伤不起啊.他发现,某男兵和某女 ...

  5. 【原创】loadrunner12.53 录制脚本时 打不开网页或者打开网页慢?

          问题描述: 之前刚装12.5版本时候,用 WebTours测试过,应用程序选择自己本地IE浏览器.exe程序,输入url地址就可以成功录制了 . 但是由于公司网络配置环境改变了(猜测),现 ...

  6. 通过java反射,封装bean

    上周有一个封装javabean的流程,成员变量有好多,一路写if(!=null){setXXX} 真的好麻烦,有时候一不小心还会漏掉,很是麻烦,就想到用反射的方法自动进行拼装bean. bean pa ...

  7. Mysql字符类型比较

    一. binary和char比较: binary 字节为单位,char字符为单位,字符占几个字节取决于字符集 binary  比较规则基于字节值,char基于字符,即使是_bin的比较规则 范围都0- ...

  8. Composer实现PHP中类的自动加载

    本篇博客承接上一篇,学习一下Composer实现的PHP的类的自动加载方式.首先说明一下,Composer是PHP针对PHP语言的第三方的依赖管理工具,将工程所用到的依赖文件包含在composer.j ...

  9. MATLAB取余求模

    (1)fix(x) : 截尾取整 >> fix( [3.12 -3.12]) ans =   3   -3 (2)floor(x): 不超过x 的最大整数.(高斯取整) >>  ...

  10. An exception occurred while acquiring a poolable resource. Will retry.

    我的是mysql-connector-java-5.1.20.jar加到lib下面就行了.或者在pom中加入配置也行.