android5.0之后如何android 获取前台应用用包名

android5.0之后如何获取当前运行的应用包名
最近在项目中需要在用户处于某一个指定的应用(非当前项目的应用)界面时,自动弹出提示窗口。为了判断触发时机,我们需要判断当前前台应用的包名,那么如何获取前台应用的包名呢?
一种很自然的思路是获取当前运行栈中栈顶的activity,然后获取该activity的包名,最后进行判断,于是有了下面的代码——
public static String getTopActivity(Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//获取正在运行的task列表,其中1表示最近运行的task,通过该数字限制列表中task数目,最近运行的靠前
List&RunningTaskInfo& runningTaskInfos = manager.getRunningTasks(1);
if (runningTaskInfos != null && runningTaskInfos.size() != 0) {
return (runningTaskInfos.get(0).baseActivity).getPackageName();
} catch (Exception e) {
logger.error("栈顶应用:" + e);
return "";
}这种方式在android5.0之前是没有问题的,然而,Android 5.0开始,Google开始对getRunningTasks接口进行限制使用。之前,使用该接口需要 android.permission.GET_TASKS即使是自己开发的普通应用,只要声明该权限,即可以使用getRunningTasks接口。但从5.0开始,这种方式以及废弃。
应用要使用该接口必须声明权限android.permission.REAL_GET_TASKS而这个权限是不对三方应用开放的。(在Manifest里申请了也没有作用),系统应用(有系统签名)可以调用该权限。
于是,有了另外一种思路:即运行应用的进程名称默认为包名,那么是不是可以通过获取进程信息间接获取到前台运行应用的包名呢?
public static String getLollipopRecentTask(Context context) {
final int PROCESS_STATE_TOP = 2;
//通过反射获取私有成员变量processState,稍后需要判断该变量的值
Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
List&ActivityManager.RunningAppProcessInfo& processes = ((ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo process : processes) {
//判断进程是否为前台进程
if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
int state = processStateField.getInt(process);
//processState值为2
if (state == PROCESS_STATE_TOP) {
String[] packname = process.pkgL
return packname[0];
} catch (Exception e) {
e.printStackTrace();
return "";
}但是该方法的前提是前台Activity所在进程的名称为包名,若在manifest中自定义了其他的进程名,则失效。
没有更多推荐了,android后台service查看当前正在运行的应用的包名
&!-- lang: java --&
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List&ActivityManager.RunningTaskInfo& taskInfo = activityManager.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topA
Log.d(tag, &当前应用:& + componentInfo.getPackageName());
& 著作权归作者所有
人打赏支持
码字总数 32090
mark另:获取所属应用的包名ctx.getPackageName()获取指定应用的PackageInfo: ctx.getPackageManager().getPackageInfo(pkgName, 0)
引用来自“道友慢走”的评论搞android了?没有,自己写了一点
搞android了?
评论删除后,数据将无法恢复
一、背景 很多时候,APK文件只存在于应用市场,在PC上无法直接下载。用手机下载下来后就直接安装了,也不能保存原始的APK文件。 APK安装到手机后,Android系统会保存一份和原始APK一模一样的...
beijing_zbs ?
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。 计划如下:...
simpower ?
1.如下脚本是逐级创建a文件夹,b文件夹,c文件夹 @echo offmd abcpause 2.批处理删除文件 @echo offdel /f /q myfile.txtpause 3.批处理(BAT)脚本中如何自动执行adb shell里面的命令 首先创建...
beijing_zbs ?
显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): android create avd --name 名称 --target 平台编号 4. 启动...
做了两年安卓开发,Androidstudio这个开发工具有一些快捷键还是挺熟练的,平常用得上的shell命令,现在我也做一下总结,总有用的: 显示系统中全部Android平台: android list targets 显示系...
大二架构师 ? 05/11 ?
adb介绍 SDK的Tools文件夹下包含着Android模拟器操作的重要命令adb,adb的全称为(Android Debug Bridge就是调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序。借助这...
xiahuawuyu ?
android adb shell 命令大全 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): android create avd --nam...
使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法: 方法一:使用aapt //aapt是sdk自带...
使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法: 方法一:使用aapt //aapt是sdk自带...
simpower ?
一、关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,...
没有更多内容
加载失败,请刷新页面
1.transparent的用法:在color、border-color、background的场景,意思为透明。只会是元素的背景色为透明的,元素里面的其他元素或内容都没有影响。 &div class="box"& &p&111111&/p& &/div&......
keai123 ? 29分钟前 ?
[root@linuxkk charge]# protoc -I=. -I=../../../ -I=../../../github.com/gogo/protobuf --gogo_out=./ charge.protoprotoc-gen-gogo: program not found or is not executable--gogo_......
p至尊宝 ? 31分钟前 ?
JVM垃圾回收与性能调优总结 JVM调优的几种策略 一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured...
cccyb ? 31分钟前 ?
壹 上节学习了基础的RabbitMQ,本次继续学习MQ相关API---SpringCloud Stream 看到Stream大致会联想到流,input,output等信息,官网解释SpringCloud Stream是给微服务应用构建消息队列驱动的能力...
___大侠 ? 37分钟前 ?
利用 GitHub Pages 快速搭建个人博客: 第一步:注册一个GitHub的账号; 第二步:创建一个公开的项目,如果创建私有的项目(需要自己掏钱购买权限); 第三步:创建项目的名字是以你账户名创...
李晓艳 ? 41分钟前 ?
本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 一、基本思想 Shar...
sietai ? 41分钟前 ?
2018年6月 29 日 -7月1日,由工业和信息化部、北京市人民政府主办的第二十二届中国国际软件博览会将在北京展览馆举行,本届展会的主题为:“新时代、新理念、新软件”。在网络爆炸性发展的现...
智和网管平台 ? 43分钟前 ?
在USER_HOME/.gradle目录下新建文件init.gradle,输入以下内容 allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/pu......
Iceberg_XTY ? 49分钟前 ?
1、引言 本文接上篇《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》,继续脑残式的网络编程知识学习 ^_^。 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程...
JackJiang- ? 51分钟前 ?
下午在排查MySQL主从同步问题时,想从主库的binlog中找一些线索,裸的binlog文件是无法直视的,mysqlbinlog这个工具是用来查看binlog文件内容的(使用方式man mysqlbinlog查看),但是使用m...
rootliu ? 51分钟前 ?
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有本帖已被设为精华帖!
本文档主要记录“获取包名和 Activity 的方法”,用于自动化测试时启动APP。以下方法主要来源于网络和社区同学的贡献,特此感谢!
方法一: pm list package查看包名 adb shell pm list package -f
将获取手机内所有apk对应的包名和路径
adb shell pm list package -3 -f
#获取第三方apk的包
方法二:dumpsys window(本人最常用)
先打开需要查找的apk后,再敲入以上命令
adb shell dumpsys window w | findstr \/ | findstr name=
adb shell dumpsys window |findstr mCurrent
adb shell "dumpsys window w|grep \/|grep name=|sed 's/mSurface=Surface(name=//g'|sed 's/)//g'|sed 's/ //g'"
注:此处用 将部分字符串替换为空,格式为“sed 's/要被取代的字串/新的字串/g'”
方法三:logcat日志抓取LAUNCHER adb shell “ logcat | grep android.intent.category.LAUNCHER "
adb logcat ActivityManager:I *:s
方法四:dumpsys activity
先启动需要的查找的apk,再敲入以上命令
adb shell dumpsys activity | grep mFocusedActivity
方法五:logcat日志抓START C:\Users\Administrator&adb shell
root@msm:/ # logcat | grep START
先启动需要查找的apk,再敲入以上命令,找到最后一个ActivityManager
方法六:aapt工具(推荐使用)
使用aapt工具 ,适合给程序自动获取 apk 的相关信息,非常实用,
//aapt是sdk自带的一个工具,在sdk\builds-tools\目录下
1.以微信为例,命令行中切换到aapt.exe目录执行输入以下命令
aapt dump badging D:\weixin658android1060.apk
2.运行后的结果中以下两行分别是应用包名package和入口activity名称,另外可看到应用使用的权限、支持的语言等信息
方法七:apktool反编译app后查看AndroidManifest.xml
1.使用反编译app
java -jar D:\Tools\apktool_2.2.3.jar d D:\Tools\weixin658android1060.apk
2.打开AndroidManifest.xml文件
manifest节点的package属性值是应用的包名:
查找android.intent.action.MAIN和android.intent.category.LAUNCHER对应的activity,该activity对应的android:name属性既是入口activity名称,android.intent.action.MAIN决定应用程序最先启动的Activity,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里
方法八:使用monkey 命令查看Activity adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER -v -v 0|findstr Using
1. findstr 和 grep 查找字符串说明
findstr:windows平台查找字符串命令, 一般格式如下:
| findstr xxx
grep:linux平台查找字符串命令,一般先adb shell 进入shell命令行再使用,也可直接使用,把shell 后面带grep的命令加双引号即可:
| grep xxx"
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
将本帖设为了精华贴
我反倒最常用最后两种,aapt 适合给程序自动获取 apk 的相关信息,AndroidManifest 适合了解整个 app 的大致情况,例如用到什么权限、什么组件等。
也许和我平时需要拿 activity 信息的时候,都没有安卓机给我用有关,哈哈。
原来如此,改天我也试试看,
6最常用,另外,云测的公司是基于apk的解析的,底层用的是什么就不清楚了。
dump window | grep mCurrent 这个比较给力
有空我也总结一个
,是的,最简单明了
—— 来自TesterHome官方
嗯,刚才试了一下,还挺好用的,多谢提醒。
请教个问题,发帖时插入的图片默认是居中显示的,如何左对齐?
这些都是日志和文字 直接贴上来就可以了,不用贴截图。
,感觉图片显示的格式更真实,有左对齐的功能吗,没有的话我抽时间再改成文字
—— 来自TesterHome官方
可以有……
补充一个本人最常用的,直接显示包名和activity ,
adb shell dumpsys activity | grep mFocusedActivity
另外楼主的Acitvity 打错了。
恭喜楼主的帖子被公众号推了。
我也贡献个,以微信为例,其它应用替换包名:
monkey -p com.tencent.mm -c android.intent.category.LAUNCHER -v -v 0|grep Using
打印出有launcher属性的activity,对已安装的应用有效。
不错不错,很实用。
手机自带busybox:
adb shell "dumpsys window w|grep \/|grep name=|busybox cut -d = -f 3|busybox cut -d ) -f 1"
系统不带busybox:
adb shell "dumpsys window w|grep \/|grep name=|sed 's/mSurface=Surface(name=//g'|sed 's/)//g'|sed 's/ //g'"
1,手机连接电脑,打开手机调试功能,并运行待测试APP,终端执行:
2,接着,执行:
dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
直接查看输出结果中mFocusedApp的值,比如
mFocusedApp=AppWindowToken{372f88d6 token=Token{3b7b14f1 ActivityRecord{ com.tencent.mm/.ui.LauncherUI t895}}}
那么,以上两个参数appPackage和appActivity的具体配置如下:
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI',
我工作中会用adb logcat ActivityManager:I *:s这个命令,然后启动app。不过有时候内容会比较多 可以先清一波日志,然后再重复以上操作
,从monkey的日志信息查看,这个方法很巧妙,一般人想不到哈
嗯,也是个不错的方法,可以看到activity之间的切换。
,多谢,又学了一个命令“sed”, ,busybox 你们经常用吗,一般用于什么测试场景?貌似必须手机root才可以安装。
如果要关注activity之间的切换,也可以用这条命令哦~adb logcat -v time -b events
好的,多谢提醒,
windows——cmd
cd apk所在目录
aapt dump badging
包名.apk | findstr "package"
aapt dump badging
包名.apk | findstr "activity"
赞一个,以前只会傻傻的用apktool反编
哈哈我有一个专门获取包名的app,我们开发给我打的包
中提及了此贴
中提及了此贴
中提及了此贴
好文章啊,很全,都是Windows下操作,666
后方可回复, 如果你还没有账号请点击这里 。
happystone (Stepthen)
第 4442 位Users /
共收到 28 条回复11:20 提问
android 5.0以上检测前台应用 包名 UsageStatsManager方法
android 5.0以上检测前台应用 包名 UsageStatsManager方法
我设定的是每5秒检测一次 可是执行了1分钟之后 它就停止了 没有数据反回不同机型持续执行的时间不同,当切换到其他的应用又开始执行了
UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 60*1000 * 3, time);
if (stats != null) {
SortedMap&Long, UsageStats& mySortedMap = new TreeMap&Long, UsageStats&();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
if (mySortedMap != null && !mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
return topPackageN
按赞数排序
我的魅族手机 每五秒检测一次
执行12次 1分钟之后 就不执行了
感觉可以申请个电量的wakelock试试
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐o(╥﹏╥)o
页面找不到了
推荐阅读:}

我要回帖

更多关于 android应用回到前台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信