安卓系统监听应用开启和关闭的实现

最近因为一个项目需要监听软件开启和关闭,以为安卓系统会有相关的BroadcastReciver,结果查了下资料,没有相关的广播,后来在论坛上看见别人用Service监听栈顶的activity实现应用开启和关闭的监听。我就直接上我的代码了。里面写有注释,如果有不懂的,可以加我QQ群与我交流:197737933.

import java.util.Timer;
import java.util.TimerTask;
import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;

public class AppListener extends Service{
    private boolean isAppStart = false;// 判断软件是否打开,过滤重复执行
    private String packageName_now = "";//记录当前所在应用的包名
    @Override
    public IBinder onBind(Intent intent) {
        // TODO 自动生成的方法存根
        return null;
    }

    @Override
    public void onCreate() {        
         timer.schedule(task, 0, 500); //开始监听应用,每500毫秒查询一次,用这种方式循环比while更节约资源,而且更好用,这个项目刚开始用了while,把我坑坏了
        super.onCreate();
    }
     Handler handler_listen = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == 1) {  
                    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
                    ComponentName cn = am.getRunningTasks(1).get(0).topActivity;//获取到栈顶最顶层的activity所对应的应用
                    String packageName = cn.getPackageName();//从ComponentName对象中获取到最顶层的应用包名
                    if (!packageName_now.equals(packageName)) {//如果两个包名不相同,那么代表切换了应用
                        packageName_now=packageName;//更新当前的应用包名
                        isAppStart=false;//将是否是监听的应用包名的状态修改为false
                    }
                    if (packageName.equals("com.tencent.mobileqq")) {//这里举例监听QQ
                        if (!isAppStart) {
                            isAppStart=true;//因为一直在循环,所以需要加个isAppStart判断防止代码重复执行
                            //。。。。逻辑处理
                        }
                    }
                }  
                super.handleMessage(msg);  
            };  
        };  
        Timer timer = new Timer();  
        TimerTask task = new TimerTask() {  

            @Override  
            public void run() {  
                Message message = new Message();  
                message.what = 1;  
                handler_listen.sendMessage(message);  
            }  
        };  

    public void onDestroy() {
        timer.cancel();//销毁服务的时候同时关闭定时器timer
        super.onDestroy();
    }

}

最后记得加上权限

   <uses-permission android:name="android.permission.GET_TASKS" />
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值