监听用户打开的应用
我们来实现一个功能,就是要知道用户现在打开的是什么应用.
这个功能有什么用呢
我想想
比如我们要给程序加锁,比如我们给微信加了一个
程序锁,必须输入密码才能进入微信
那么我们要知道我们打开的程序是微信,
然后开启一个输入密码的界面
我们用服务来实现这个功能
因为我们要一直监听打开的程序,所以是一个耗时
的操作
我们放到子线程中去,
当然是在onCreate方法中执行
public void onCreate(){
new Thread(){
}.start();
}
原理简单但是有点傻
其实就是我们一直刷新最新的任务栈,也就是最新
的应用.
然后就看这个应用里面最底层的activity的包名
先拿到ActivityManager
我们先获取最新的任务栈
List<RunningTaskInfo> runningTasks =
am.getRunningTasks(1);
这里为什么是1,因为系统会自动把最新的那个任务
栈也就是最新的那个应用给我们
然后我们遍历runningTasks
for (RunningTaskInfo runningTaskInfo :
runningTasks) :
然后我们拿到单个的runnningTaskInfo
然后拿到最底层的activity
ComponentName baseactivity =
runningTaskInfo.baseActivity;
然后获取包名
String packageName =
baseactivity.getPackageName();
OK,这样我们就获取到了最新打开的任务栈(应用)
的包名.
注意了,这里我们要加一个权限
就是获取任务栈的权限
<uses-permission
android:name="android.permission.GET_TASKS"
/>
还有一个问题
我们的操作是放在子线程中执行的
所以我们关闭这个服务stopService的时候
子线程没有被关闭,还是在操作
所以我们要关闭子线程,那么我们在Service的onDestroy方法里面实现
我们给while循环加一个条件,当服务开启的时候再进行这个while循环
来个成员变量
private boolean isServiceRunning=ture;
while(isServiceRunning)
在onDestroy里面
isServiceRunning=false;
这样while循环就停止了
然后再在onCreate方法刚开始的时候设置一下
onCreate:
isServiceRunning=true;
还有一个问题
我们现在while循环开启的时候一直在循环
这样非常消耗内存
那么我们加一点条件让循环少一点
每次while循环结束的时候我们让循环休息一会儿
暂停
来个sleep(500);
然后try catch一下