Activity启动模式
------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启动模式的更多相关文章
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- 【转】Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 在学习Android的过程中,Intent是我们最常用Android用于进程内或进 ...
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Android-3 Activity启动模式
Activity启动模式 android:launchMode="singleTask" * Standard 每次都创建一个新实例 -- TaskID不变,ActivityID改 ...
- Android Activity 启动模式详解
最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...
- Activity 启动模式 FLAG
原文:https://blog.csdn.net/youhongyan/article/details/64151922 一.Activity启动模式的设置在AndroidManifest.xml文件 ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- Activity启动模式(lauchMode)
Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址 ...
- AndroidのActivity启动模式
Activity启动模式 .概念 Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否 .属性 Activity的启 ...
- activity启动模式之singleInstance
activity启动模式之singleInstance 一.简介 Log.d("C2", getTaskId()+"");里面的getTaskId()可以获取a ...
随机推荐
- 百度echart使用心得,百度图表。
百度echart算是百度针对数据展示做的一个图表插件吧,一般我们使用都不是问题,主要还是对于对动态数据的解析.我这里使用饼状图,和柱状图为例: 首先,我们需要定义一个绘图的容器:(class是我自己定 ...
- 解决sublime text3 文件名,小框框的办法
解决sublime text3 文件名,小框框的办法 之前一直都是用的英文命名的文件夹,到前几天才发现,用中文,来命名文件夹出现了乱码问题. 今天晚上,自己也在网上去百度了很多方案,好像大部分都不太有 ...
- iOS10 权限适配
权限适配 这应该算iOS10系统适配的范畴,最近这两个都在弄,所以就直接和Xcode8适配一起写出来了. 在iOS10之后需要在Info.plist中,添加新的字段获取权限,否则在iOS10上运行会导 ...
- ReactNative win10初体验
根据RN中文网上的文档搭建环境,有的地方说的不是很清楚,所以小白的我搞了很久,终于搭建成功,这里分享一下 1. java: jdk和jre,我下载的是1.8(因为官方文档上说AndroidStudio ...
- Linux CentOS 7通过yum命令安装Mono4.0.1
前言 上一篇中提到的快照方式安装Mono,该方式并不稳定,需要做各种配置,各种修改才能与jexus搭配运行. 一.安装源 rpm --import "http://keyserver.ubu ...
- bash 相关的一些小代码片断
批量修改文件名: for i in *.html; do mv $i ${i/oldstring/newstring}; done; 批量替换文件内容: sed -i "s/oldstrin ...
- centos 7 挂载大硬盘
对硬盘sdb进行分区 parted -a optimal /dev/sdb 使用GPT格式 mklabel gpt 建立一个主分区 mkpart primary - 显示分区信息 print 退出 q ...
- PHP中获取当前页面的完整URL
//获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br>"; #localhost//获取网页地址 echo $_SERVER['PHP ...
- ubuntu软件推荐
本文推荐的ubuntu工具均为笔者亲用.原则:在精不在多. 0.万能类 笔者崇尚[极简主义],常用的工具如果有网页版的就尽量不用单独的client.如网页版微信. 1.系统类 截图:Deepin-sc ...
- shell脚本的执行方式
编写好的shell脚本(如:test),可以采取两种方式进行运行: 一. $ sh test 一般不采用这种调用方式,尤其不采用"sh<test"的调用方式,因为这种方式将禁 ...