❶ android广播打开软件需要开起弹窗权限
引导用户打开相应权限
获取当前堆栈,判断应用是否被打开,如果未被打开则强行将应用提至前台
经过测试,第一种方法无效。第二种方案是必备的,让用户打开权限自然是最好的,第三种方法则是比较取巧的方法,这里着重讲第三种方案
先判断我们的界面是否已经被调用到前台
ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List list = activityManager.getRunningTasks(1);
if (list != null && list.size() > 0) {
ComponentName cpn = list.get(0).topActivity;
Log.e("className",""+cpn.getClassName());
if (className.equals(cpn.getClassName())) {
return true;
❷ Android 获取当前栈顶activity
这个方法需要app获取android.permission.REAL_GET_TASKS权限
Android 5.0以上只对系统应用开放。
Android5.0以下需要添加权限:
android.permission.GET_TASKS
❸ Android中的Activity详解--启动模式与任务栈
目录
activity的简单介绍就不写了,作为最常用的四大组件之一,肯定都很熟悉其基本用法了。
首先,是都很熟悉的一张图,即官方介绍的Activity生命周期图.
情景:打开某个应用的的FirstActivity调用方法如下:
由于之前已经很熟悉了,这里就简单贴一些图。
按下返回键:
重新打开并按下home键:
再重新打开:
在其中打开一个DialogActivity(SecondActivity)
按下返回:
修改SecondAcitvity为普通Activity,依旧是上述操作:
这里强调一下 onSaveInstanceState(Bundle outState) 方法的调用时机:
当Activity有可能被系统杀掉时调用,注意,一定是被系统杀掉,自己调用finish是不行的。
测试如下:FirstActivity启动SecondActivity:
一个App会包含很多个Activity,多个Activity之间通过intent进行跳转,那么原始的Activity就是使用栈这个数据结构来保存的。
Task
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.
即若干个Activity的集合的栈表示一个Task。
当App启动时如果不存在当前App的任务栈就会自动创建一个,默认情况下一个App中的所有Activity都是放在一个Task中的,但是如果指定了特殊的启动模式,那么就会出现同一个App的Activity出现在不同的任务栈中的情况,即会有任务栈中包含来自于不同App的Activity。
标准模式,在不指定启动模式的情况下都是以此种方式启动的。每次启动都会创建一个新的Activity实例,覆盖在原有的Activity上,原有的Activity入栈。
测试如下:在FirstActivity中启动FirstActivity:
当只有一个FirstActivity时堆栈情况:
此种模式下,Activity在启动时会进行判断,如果当前的App的栈顶的Activity即正在活动的Activity就是将要启动的Activity,那么就不会创建新的实例,直接使用栈顶的实例。
测试,设置FirstActivity为此启动模式,多次点击FirstActivity中的启动FirstActivity的按钮查看堆栈情况:
(其实点击按钮没有启动新Activity的动画就可以看出并没有启动新Activity)
大意就是:
对于使用singleTop启动或Intent.FLAG_ACTIVITY_SINGLE_TOP启动的Activity,当该Activity被重复启动(注意一定是re-launched,第一次启动时不会调用)时就会调用此方法。
且调用此方法之前会先暂停Activity也就是先调用onPause方法。
而且,即使是在新的调用产生后此方法被调用,但是通过getIntent方法获取到的依旧是以前的Intent,可以通过setIntent方法设置新的Intent。
方法参数就是新传递的Intent.
1.如果是同一个App中启动某个设置了此模式的Activity的话,如果栈中已经存在该Activity的实例,那么就会将该Activity上面的Activity清空,并将此实例放在栈顶。
测试:SecondActivity启动模式设为singleTask,启动三个Activity:
这个模式就很好记,以此模式启动的Activity会存放在一个单独的任务栈中,且只会有一个实例。
测试:SecondActivity启动模式设为singleInstance
结果:
显然,启动了两次ThirdActivity任务栈中就有两个实例,而SecondActivity在另外一个任务栈中,且只有一个。
在使用Intent启动一个Activity时可以设置启动该Activity的启动模式:
这个属性有很多,大致列出几个:
每个启动的Activity都在一个新的任务栈中
singleTop
singleTask
用此种方式启动的Activity,在它启动了其他Activity后,会自动finish.
官方文档介绍如下:
这样看来的话,通俗易懂的讲,就是给每一个任务栈起个名,给每个Activity也起个名,在Activity以singleTask模式启动时,就检查有没有跟此Activity的名相同的任务栈,有的话就将其加入其中。没有的话就按照这个Activity的名创建一个任务栈。
测试:在App1中设置SecondActivity的taskAffinity为“gsq.test”,App2中的ActivityX的taskAffinity也设为“gsq.test”
任务栈信息如下:
结果很显然了。
测试:在上述基础上,在ActivityX中进行跳转到ActivityY,ActivityY不指定启动模式和taskAffinity。结果如下:
这样就没问题了,ActivityY在一个新的任务栈中,名称为包名。
这时从ActivityY跳转到SecondActivity,那应该是gsq.test任务栈只有SecondActivity,ActivityX已经没有了。因为其启动模式是singleTask,在启动它时发现已经有一个实例存在,就把它所在的任务栈上面的Activity都清空了并将其置于栈顶。
还有一点需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由于SecondActivity并没有指定MAIN和LAUNCHER过滤器,故在FirstActivity跳转到SecondActivity时,按下home键,再点开App1,回到的是FirstActivity。
大致就先写这么多吧,好像有点长,废话有点多,估计也有错别字,不要太在意~~~
❹ Android 任务栈
任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。设备主屏幕是大多数任务的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务将出现在前台。 如果应用不存在任务(应用最近未曾使用),则会创建一个新任务,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。
当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行。
上述文字摘自 Android开发者官网
默认行为的场景 :当前的task包含4个activity–当前activity下面有3个activity。当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上。过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task)。那个task,仍然包含着4个activity。当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前activity从task栈中移出后栈顶的那个activity。
❺ Android 5.0以后如何获取topActivity
RunningAppProcessInfo currentInfo = null;
Field field = null;
int START_TASK_TO_FRONT = 2;
String pkgName = null;
try {
field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) {
return null;
}
ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = manager.getRunningAppProcesses();
if (appList == null || appList.isEmpty()) {
return null;
}
for (RunningAppProcessInfo app : appList) {
if (app != null && app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
Integer state = null;
try {
state = field.getInt(app);
} catch (Exception e) {
return null;
}
if (state != null && state == START_TASK_TO_FRONT) {
currentInfo = app;
break;
}
}
}
if (currentInfo != null) {
pkgName = currentInfo.processName;
}
return pkgName;
上述代码走到field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");这一句话的时候,走到了catch里面,返回空值,上面这句话有错吗
❻ Android的任务栈
任务是指在执行特定作业(任务 task)时与用户交互的activity。这些Activity按照各自打开的顺序 排列在堆栈(返回栈)中。设备的屏幕 桌面的图标(launcher)是多数据任务的的起点。当用户触摸应用启动器中的图标时,该用户的任务将出现在前台。如果应用不存在任务(应用未曾使用),则会创建一个新的任务,并且该应用的"主Activity将作为堆栈中的根Activity打开"。
当Activity启动另一个Activity时,该新Activity会被推送到堆栈的顶部,如果当前app只有一个栈 且app处于前台,那么这个栈顶的Activity用户应该是可见的,而启动栈顶这个Activity(启动者)仍然保留在堆栈中,但是是处于停止状态。Activity停止时系统会保留其用户信息 在Activity onSaveInstanceSate、 onRestoreInstanceState(Bundle savedInstanceState) 方法 具体可以查看这两个方法。当用户按"返回"按钮时,当前Activity(所谓当前Activity一定是用户可以看到的在栈顶的)会从堆栈顶部弹出(Activity被销毁 走onDestory方法)这里说销毁也不太严格 因为正常情况下会被销毁 在不存在内泄漏导致Activity回收不掉的情况。栈顶的Activity被销毁 它下面的Activity就会恢复执行(下面这个Activity露头你可以看到它了)。堆栈中的Activity永远不会重新排序,我们操作app的功能时 仅仅是 进入页面(压栈)退出页面(弹栈),因此返回栈(弹栈)以 "后进先出"的对象结构运行。
任务是一个有机整体,当用户开始新任务或通过点击"home键" 这个时候应用会切换到“后台”,在后台时该任务中的所有Activity全部停止,但是任务的返回栈仍旧不变,也就是说,当另一个任务发生时,该任务仅是失败焦点而已
如何更通过api查看当前应用中的任务
发现当前只有一个任务
同时通过这个任务我们可以查看当前栈顶的activity如下图
❼ 如何得到Activities栈顶的Activity名称
步骤:
1. 得到当前运行环境(context)的Activity管理器;
2. 通过Activity管理器得到当前的任务栈信息;
3. 从任务栈中获得栈顶的Activity的名称。
举例 :
String getTopActivity(Activity context)
{
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE) ;
List runningTaskInfos = manager.getRunningTasks(1) ;
if(runningTaskInfos != null)
return (runningTaskInfos.get(0).topActivity).toString() ;
else
return null ;
}
最后不要忘记在AndroidManifest.xml中增加权限:
❽ android中的任务栈,是一个任务栈包含前台任务栈和后台任务栈,还是任务栈分为前台的任务栈
任务栈分为前台的任务栈,当前activity活动所在的栈称为前台任务栈。
❾ 安卓自动化测试怎么获取当前正在运行activity
android开发中获取当前的Activity有多种情况; 在Activity中,this就是当前的Activity,例如this.startActivity。 在Fragment中可以通过 getActivity()来得到当前装载这个Fragment的Activity。 通过Activity堆栈来获取当前显示的这个ActivityAc。详细的可以看看安卓巴士教程:http://www.apkbus.com/thread-462912-1-1.html
❿ android利用adb命令,获取当前界面(当前Task的栈顶).
开发项目中经常会遇到很多手机厂商制造的麻烦.如涉及权限,程序授权(受信任应用),或service自启动管理等.由于android手机种类繁多,厂商自制系统各自为王.弄得我们有时不得不针对固定的厂商或机型做定制开发.
本文就提供一种靠adb命令获取手机当前activity的方法!
1.首先 要配置adb环境变量 这里就不多说了,自己网络就好了,非常简单!
2.配置好环境变量后,就可以运用adb 命令了.
以OPPO r9S获取自启动管理界面为例:
将手机调好到指定界面后:打开cmd 输入
1) adb devices //查看链接设备
adb shell mpsys activity top //获取栈顶activity
![Q%T]T N0RQ0X{@ GP~TVZFG.png]( http://upload-images.jianshu.io/upload_images/3995903-d4895ea759168dc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
2) 1.cmd命令中输入:adb shell 进入shell命令模式
2.shell中输入:logcat | grep ActivityManager 真机运行应用,可以实时 查看当前正在运行的Activity;
或者也可以用第二种方法.
至于用那种,看界面吧,这里第二种就不贴图了.读者自己去尝试吧!
补充:已测试手机(为service开启自启动或设置受保护程序);