Android singleInstance启动模式实际开发中使用频率不高,最近解了一个bug,与此相关,bug虽然很轻松的解决了,但由它引发的对Activity的启动模式的思考却有点意思,本篇记录分享下。
要弄清上面的问题,不得不先提下Tasks和Back Stack的概念。
Android系统下,当用户为了完成某一个功能可能需要进行多个Actvitiy间的跳转才能达到目的,这些Activity的跳转序列就被Android抽象成了一个Task。而这一组Actvitiy实例都被放到了同一个栈中,先启动的Activity位于栈底,最后到达的Activity位于栈顶。一般而言Task的启动点都是从home 界面算起,点击Launcher界面的应用icon,如果之前没有启动过,则系统新建一个Task,刚启动应用的主Activiy被压入栈底,栈内的Activity是不会在内部重新排列的,只能按先入后出的顺序呈现,当用户连续按back键,使得栈底的Activity也pop出栈,栈为空了,这时该Task结束。Task是抽象的概念,指带了一组Activity,它们为实现用户的某个操作目的而聚在了一起,可以来自不同应用,Back Stack是实实在在用来存放管理这一组Activity的。Back Stack可以放多个Task,而每一个Task可以包含一个或多个Activity实例。
当用户操作同一个Task内的Activity时,其默认的情况如下:
- Activity-A启动Activity-B后,Activiyt-B被压入Activity-A所处的栈中并位于其上, Activity-A不在可见,但状态被记录下来,比如Activity-A里面EditText内输入的内容,当用户按一次back键返回时Activity-A重新可见,并且其内部的EditText输入内容依然存在,Activiyt-B被pop出栈,状态不保留。
- Activity-A启动Activity-B后,用户按home键返回桌面,系统会将此时的task打包进行状态保存,也就是说位于栈内的每个Activity状态都被保存下来了。用户重新启动**该task,位于栈顶的Activity 可见并走onResume方法。
写一个demo还原当时的Task现场。代码很简略,目的就是实验singleInstance启动模式对back键的影响。
ActivityA代码:
package com.azhengye.demolaunchmode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class ActivityA extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
findViewById(R.id.start_b).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
}
}
ActivityB代码:
package com.azhengye.demolaunchmode;
import android.app.Activity;
import android.os.Bundle;
public class ActivityB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}
}
清单代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.azhengye.demolaunchmode"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name=".ActivityA" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ActivityB"
android:launchMode="singleInstance" />
</application>
</manifest>
布局文件省略掉,注意这里在清单文件中对ActivityB的启动模式做了设置android:launchMode="singleInstance"。启动demo程序,从ActivityA跳转到ActivityB,此时停留在ActivityB,使用命令: adb shell dumpsys activity a
查看当前的任务栈信息。demo中的信息输出如下图,为了方便呈现,只保留了部分输出。
然后我们将清单文件中的android:launchMode="singleInstance"去掉,输出如下:
对照上面的有下面的结论:
1. 当设置了singleInstance启动模式,ActivityA和ActivityB都被放到了同一个栈中,即Stack #41,但是它们分属不同的Task,ActivityA位于Task344,ActivityB位于Task435。
2. 默认的启动模式,ActivityA和ActivityB都被放置在了同一个Task中。
3. 任务栈其实包含了两个概念–栈和任务(Task),一个栈里可以有多个任务(Task),一个任务(Task)可以有多个Activity。
开篇提出的问题”为何设置成singleInstance就会出现这种bug?”这里我是这样理解的:前台Activity所属的task清空就会返回到桌面,因为singleInstance模式启动的Activity会新开一个独立的task,当按下back键后,该task中的唯一ActivityB 被pop出栈,Task为空,直接返回了桌面。
本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6956800.html,如需转载请自行联系原作者
来源:https://yq.aliyun.com/articles/567334
以下为读书笔记: 实际项目中,我们要通过特定的需求,为每个活动指定恰当的启动模式。 Android一共有4种启动模式:standard、singleTop、singleTask、singleInstance. 通过<activity>标签的 android:launchMode 来选择启动模式。 每个应用程序都有自己的返回栈,singleInstance使用单独的返回栈供...
1,standard 标准 【1】Activity启动模式,不出意外,使用最多的一定是默认的,standard 标准的。但是standard 标准的 这种启动模式,每启动一个Activity 就进栈一个Activity,这样有些情况下是不合理的,我的Activity在最顶端就没有必要,再次启动进栈一个 或者启动进栈多个Activity的引用重复,这样不利于Activi...
1,什么是启动模式 启动模式允许您定义 Activity 的新实例如何与当前任务关联。 2,Andorid 四种启动模式: 【1】 "standard"(默认模式) 默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。 Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个...
Android Activity启动模式 Activity作为Android四大组件之首,它非常重要,有时候为了项目的需要,就必须使用Activity的启动模式,所以我们必须要搞清楚Activity的启动模式和标志位: Android Activity启动模式 1 .Activity的LaunchMode (1). standard:标准模式 (2). singleTop:栈顶复用模式 (3). ...
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/41087993 定义启动模式 启动模式允许你去定义如何将一个Activity的实例和当前的任务进行关联,你可以通过以下两种不同的方式来定义启动模式: 1.使用manifest文件 当你在manifest文件中声明一个Activity的时候,你可以指定这个Activity在启动的时候该...
activity启动模式有四种 1、standard 这个是活动启动的默认模式,系统不会管这个活动在栈中是否存在,每次启动都会创建一个新的实例。 Intent intentSelf= new Intent(MainActivity.this, MainActivity.class); startActivity(intentSelf); 如上面的自己启动自己,还是会创建的。 2、singleTop...
启动模式概述 我们知道android中是通过任务和返回返回栈来管理Activity,Android 管理任务和返回栈的方式是将所有连续启动的 Activity 放入同一任务和“后进先出”堆栈中。启动模式的作用是用来指定启动的 Activity 的新实例如何与当前任务关联,这句话可能有点抽象,后面会举例详细介绍启动模式的作用 Activity与任务栈关联性 在介绍启动模式之前...
目前Activity有四种启动模式:standard,singTop,singleTask,singInstance 1.standard:标准模式,这也是系统的默认模式,每次启动一个Activity都会重新创建一个实例,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中,比如A启动了B(standard模式),B就会进入A所在的栈中...
1.安装XAMPP,下载链接(https://www.apachefriends.org/index.html) 1.1选择winds10版本 2.安装XAMPP 2.1下载完毕后打开安装包安装一路确定有勾打勾,最后安装完毕 2.2安装完毕之后软件会跳出选择语言,选英语即可,然后会自动运行该软件,界面如下图所示(重启之后) 2.3打开界面之后会看到Modul列里有个apache服务,点击start...
lstm的模型图如下 其中xt为当前时刻的输入,ct-1为上一个时刻的记忆,ht-1为上一个时刻的输出 分为输入门,遗忘门,输出门,三个门来实现 1.遗忘门: 遗忘门是用来计算上一时刻的记忆保存多少,计算方式为ft=sigmoid(Wf*[ht-1,xt]+bf),这个计算出是一个0,1之间的数字 2.输入门: 输入门是用来计算当前状态的记忆,计算方式为 it = sigmoid(Wi*[ht-1...
I have one angular app and one spring boot app, there is one request goes from UI to spring boot with some 100-200 objects even more, for each of these objects another back end system is called within...
I found this code: Unfortunately, this works on a windows machine. I couldn't find a way to rebind the print screen key on Solaris. I found out that I needed to disable the shortcut from the "key...
The code is the following: It should add one for each input. Right now it stays the same. For example, when you answer "What is your name", it should change risk form 0 to 1. You have to add...
Ok, i know this is a stupid question but i'm new with node.js and jade and sqlite3... so i was wondering how can i send the database dates from a javascript scrit to jade template to populate a table....
I'm new to testing with Pytest, and I've run into a minor but annoying hangup. In the command line test session results, I see my tests passing, but the percentage shown is not 100%, for some tests. W...