监听应用的启动
2016-05-01 00:01
501 查看
对于如何监听一个新应用的启动,我们之前可以使用这样的方法:
通过这行代码,我们就能拿到最新启动的应用的包名了,如果再使用轮询执行该代码,也就能够监听到新应用的启动了。
但是,悲伤的事情发生了,当你在android5.0上使用该代码时,发现已经不起作用了。
看官方对于函数public List getRunningTasks(int maxNum)的说明原话:
意思就是自从LOLLTPOP版本也就是5.0开始该方法已经不用啦!这也是为了安全考虑吧。
但是该做的事情我们还要做啊,接下来该怎么办呢?当你打开360的时候,发现人家360照样可以监听软件的启动啊,我们应该还有方法啊,于是我就开始了寻找新的方法,后来发现使用UsageStatsManager这个类也可以实现该功能。
我就正式开始讲怎么做吧.
1、权限 在配置文件中加入如下权限。
同时,记得提醒用户去开启该权限,这个要在5.0才能使用,5.0以下的代码会报空指针:
2、接下来就要以5.0为分界线了。
在5.0之前我们还是使用老方法,因为新方法只是要5.0才能使用。老方法就是本文开始的写的代码。
接下来我们开始介绍5.0及之后怎么做。
我接下来分析一下原理,重点是UsageStatsManager中的queryUsageStats方法,该方法会将某个时间段内用过的app的信息以一个list的方式返回给我们,返回的信息很多,其中包括每个app的mLastTimeUsed(最后使用的时间)和mPackageName。ok,这下就好办了,我们用过一个算法把最后使用时间最晚的一个包名拿出来,这个就肯定是我们最新启动的app了。
(ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE).getRunningTasks(1).get(0).getPackageName();
通过这行代码,我们就能拿到最新启动的应用的包名了,如果再使用轮询执行该代码,也就能够监听到新应用的启动了。
但是,悲伤的事情发生了,当你在android5.0上使用该代码时,发现已经不起作用了。
看官方对于函数public List getRunningTasks(int maxNum)的说明原话:
@deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method * is no longer available to third party
意思就是自从LOLLTPOP版本也就是5.0开始该方法已经不用啦!这也是为了安全考虑吧。
但是该做的事情我们还要做啊,接下来该怎么办呢?当你打开360的时候,发现人家360照样可以监听软件的启动啊,我们应该还有方法啊,于是我就开始了寻找新的方法,后来发现使用UsageStatsManager这个类也可以实现该功能。
我就正式开始讲怎么做吧.
1、权限 在配置文件中加入如下权限。
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
同时,记得提醒用户去开启该权限,这个要在5.0才能使用,5.0以下的代码会报空指针:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); startActivity(intent);
2、接下来就要以5.0为分界线了。
在5.0之前我们还是使用老方法,因为新方法只是要5.0才能使用。老方法就是本文开始的写的代码。
接下来我们开始介绍5.0及之后怎么做。
//对版本进行判断,要5.0开始才能用 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); long time = System.currentTimeMillis(); //拿到所有的app信息 List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time); if (stats != null) { //根据最晚使用时间找到新打开的app UsageStats latestUsageStaus = null; for (UsageStats usageStats : stats) { if (latestUsageStaus == null) { latestUsageStaus = usageStats; } else { if (usageStats.getLastTimeUsed() > latestUsageStaus.getLastTimeUsed()) { latestUsageStaus = usageStats; } } } if(latestUsageStaus==null)return null; return latestUsageStaus.getPackageName(); } }
我接下来分析一下原理,重点是UsageStatsManager中的queryUsageStats方法,该方法会将某个时间段内用过的app的信息以一个list的方式返回给我们,返回的信息很多,其中包括每个app的mLastTimeUsed(最后使用的时间)和mPackageName。ok,这下就好办了,我们用过一个算法把最后使用时间最晚的一个包名拿出来,这个就肯定是我们最新启动的app了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories