Android监听进入和退出第三方应用
本篇文章基本实现,监听进入和退出第三方应用的功能。经验不足,有问题之处,欢迎留言指出,先三克油了。参考文章http://blog.csdn.net/xiao_chilun/article/details/52096149。大致的思路如下:
创建一个service,每隔一定时间获取当前运行应用的packageName,并把该值赋给一临时变量temp。当未有应用运行时,获取的是手机桌面应用Lanucher。现在packageName和temp的组合值有5中情况:
未进入应用
第一种情况:packageName=系统应用包名
temp=系统应用包名
进入应用
第二种情况:packageName=第三方应用包名
temp=系统应用包名
第三种情况:packageName=第三方应用包名
temp=第三方应用包名
退出应用
第四种情况:packageName=系统应用包名
temp=第三方应用包名
第五种情况:packageName=系统应用包名
temp= 系统应用包名
分析后,第二种情况是进入应用,第四种情况是退出应用。
先挂两个知识点:
1、判断是否为第三方应用
//判断是否为第三方应用public boolean isThirdPartApp(String packageName) {boolean b = false;PackageInfo mPackageInfo = null;try {mPackageInfo = getApplication().getPackageManager().getPackageInfo(packageName, 0);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}//判断是否为系统预装的应用if ((mPackageInfo.applicationInfo.flags & mPackageInfo.applicationInfo.FLAG_SYSTEM) <= 0 ) {//第三方应用b = true;} else{//系统应用}return b;}
2、获取当前运行的应用包名
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);
ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
ComponentName topActivity = runningTaskInfo.topActivity;
String packageName = topActivity.getPackageName();
具体实现方法:
public class ListenerService extends Service {private String temp = null;private List<String> mList = new ArrayList<>();private static final String TAG = "ListenerService";private static boolean flag = true;//服务Destroy结束线程private ActivityManager am;@Overridepublic void onCreate() {super.onCreate();//监视任务栈最顶端应用am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);new Thread() {@Overridepublic void run() {super.run();while (flag) {synchronized (ListenerService.class) {List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);ComponentName topActivity = runningTaskInfo.topActivity;String packageName = topActivity.getPackageName();if (!getPackageName().equals(packageName) && !getPackageName().equals(temp) && temp != null) {//进入第三方应用,第二种情况if (isThirdPartApp(packageName) && !isThirdPartApp(temp)) {if (mList.contains(packageName)) {Log.i(TAG, packageName + ":返回第三方应用");} else if (!mList.contains(packageName)) {mList.add(packageName);Log.i(TAG, packageName + ":首次进入第三方应用");}//退出第三方应用,第四种情况} else if (!isThirdPartApp(packageName) && isThirdPartApp(temp)) {Log.i(TAG, packageName + ":退出第三方应用");}}temp = packageName;SystemClock.sleep(500);}}}}.start();}@Overridepublic void onDestroy() {super.onDestroy();flag = false;mList.clear();mList = null;}@Overridepublic IBinder onBind(Intent intent) {return null;}//判断是否为第三方应用public boolean isThirdPartApp(String packageName) {boolean b = false;PackageInfo mPackageInfo = null;try {mPackageInfo = getApplication().getPackageManager().getPackageInfo(packageName, 0);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}//判断是否为系统预装的应用if ((mPackageInfo.applicationInfo.flags & mPackageInfo.applicationInfo.FLAG_SYSTEM) <= 0 ) {//第三方应用b = true;} else{//系统应用}return b;}
}
在application中调用
public class MyApplication extends Application{@Overridepublic void onCreate() {super.onCreate();startService(new Intent(this, ListenerService.class));}
}
最后,在清单文件中注册,并添加权限
<uses-permission android:name="android.permission.GET_TASKS"/><applicationandroid:persistent="true"android:name=".MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name="com.closeness.comment.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><service android:name="com.closeness.comment.ListenerService"/></application>
Android监听进入和退出第三方应用相关推荐
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...
- Android 监听 WiFi 开关状态
Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...
- android 监听手机电量变化
今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...
- android 监听手机开机
今天,简单讲讲 android 监听手机开机. 需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统 ...
- android 监听屏幕是否锁屏
今天,简单讲讲如何监听手机屏幕是否锁屏. 实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可 ...
- android 监听网络状态
今天,讲讲怎么监听手机网络状态的改变. 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:nam ...
- android 应用监听home键,Android 监听Home键
搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. private final BroadcastReceiver homeRece ...
- android通知栏的点击事件,Android监听消息通知栏点击事件
Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...
- Android锁屏界面监听按键,Android 监听锁屏/开屏事件
1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 2. BroadcastReceiver 2.1. 事件 总共有3个事件: Intent.AC ...
最新文章
- 最新!中国大学生源质量排行榜(2019):双一流高校表现突出!
- 【Python初级】009-错误与异常
- ffmpeg文件拼接
- mysql source防止乱码
- 手机网页 右边的空白区
- 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
- 字符串基本操作 c语言,数据结构C语言字符串的基本操作.doc
- Vue——整合Katex
- RMEB运行环境要求
- zzulioj 1065:统计数字字符个数
- COM域名难逃实名监管 CN域名简化流程抢用户
- linux部署前后端分离项目命令笔记
- 2008北京奥运会歌曲推荐
- [抄]外部奖励对内在动机的侵蚀
- redis php教程pdf,ThinkPHP中简单使用Redis
- 开课吧:什么是排序算法
- JAVA程序提取PDF中间页
- 样式中的url加载探疑
- 国外 Warez 网站 杂集
- 尚学堂百战程序员1573题---答案总结第三章 控制语句