07_获取最新应用的包名

监听用户打开的应用

我们来实现一个功能,就是要知道用户现在打开的是什么应用.

这个功能有什么用呢

我想想

比如我们要给程序加锁,比如我们给微信加了一个

程序锁,必须输入密码才能进入微信

那么我们要知道我们打开的程序是微信,

然后开启一个输入密码的界面

我们用服务来实现这个功能

因为我们要一直监听打开的程序,所以是一个耗时

的操作

我们放到子线程中去,

当然是在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的时候

子线程没有被关闭,还是在操作

 

所以我们要关闭子线程,那么我们在ServiceonDestroy方法里面实现

 

 

 

我们给while循环加一个条件,当服务开启的时候再进行这个while循环

 

来个成员变量

private boolean isServiceRunning=ture;

 

while(isServiceRunning)

 

onDestroy里面

isServiceRunning=false;

 

这样while循环就停止了

 

然后再在onCreate方法刚开始的时候设置一下

onCreate:

isServiceRunning=true;

 

 

 

 

 

还有一个问题

我们现在while循环开启的时候一直在循环

这样非常消耗内存

 

那么我们加一点条件让循环少一点

 

每次while循环结束的时候我们让循环休息一会儿

暂停

来个sleep(500);

然后try catch一下

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(07_获取最新应用的包名)