本篇文章基本实现,监听进入和退出第三方应用的功能。经验不足,有问题之处,欢迎留言指出,先三克油了。参考文章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监听进入和退出第三方应用相关推荐

  1. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...

  2. Android 监听 WiFi 开关状态

    Android 监听 WiFi 开关状态 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854309 本文出自[赵彦军的博客] ...

  3. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  4. android 监听手机开机

    今天,简单讲讲  android 监听手机开机. 需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统 ...

  5. android 监听屏幕是否锁屏

    今天,简单讲讲如何监听手机屏幕是否锁屏. 实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可 ...

  6. android 监听网络状态

    今天,讲讲怎么监听手机网络状态的改变. 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:nam ...

  7. android 应用监听home键,Android 监听Home键

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. private final BroadcastReceiver homeRece ...

  8. android通知栏的点击事件,Android监听消息通知栏点击事件

    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...

  9. Android锁屏界面监听按键,Android 监听锁屏/开屏事件

    1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 2.  BroadcastReceiver 2.1. 事件 总共有3个事件: Intent.AC ...

最新文章

  1. 最新!中国大学生源质量排行榜(2019):双一流高校表现突出!
  2. 【Python初级】009-错误与异常
  3. ffmpeg文件拼接
  4. mysql source防止乱码
  5. 手机网页 右边的空白区
  6. 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
  7. 字符串基本操作 c语言,数据结构C语言字符串的基本操作.doc
  8. Vue——整合Katex
  9. RMEB运行环境要求
  10. zzulioj 1065:统计数字字符个数
  11. COM域名难逃实名监管 CN域名简化流程抢用户
  12. linux部署前后端分离项目命令笔记
  13. 2008北京奥运会歌曲推荐
  14. [抄]外部奖励对内在动机的侵蚀
  15. redis php教程pdf,ThinkPHP中简单使用Redis
  16. 开课吧:什么是排序算法
  17. JAVA程序提取PDF中间页
  18. 样式中的url加载探疑
  19. 国外 Warez 网站 杂集
  20. 尚学堂百战程序员1573题---答案总结第三章 控制语句

热门文章

  1. Win10 中文输入法关闭 Ctrl+Shift+B 快捷键
  2. 如何UNI-APP中使用iconfont彩色图标
  3. python读取excel表格数据
  4. 百度APP视频播放中的解码优化
  5. 阿里再发10亿助农,店宝宝:中小卖家喜迎流量红利
  6. win7系统问题:——桌面壁纸变黑解决方案
  7. JavaScript——实现九九乘法表
  8. eap-peap/mschapv2
  9. 奶茶新手加盟奶茶品牌培训哪些技能?
  10. 读后感:【许岑—如何成为有效学习的高手】