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

最近因为一个项目需要监听软件开启和关闭,以为安卓系统会有相关的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" />
你可以使用Android系统的AccessibilityService来监听应用的打开。AccessibilityService是一种特殊的Service,可以监控用户界面操作,包括用户打开应用、点击按钮、输入文字等等。 首先,在AndroidManifest.xml文件中声明AccessibilityService: ```xml <service android:name=".MyAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service> ``` 然后,在res/xml目录下创建accessibility_service_config.xml文件,配置AccessibilityService的属性: ```xml <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/accessibility_service_description" android:accessibilityEventTypes="typeWindowStateChanged" android:accessibilityFlags="flagRetrieveInteractiveWindows" android:canRetrieveWindowContent="true" android:packageNames="com.example.package1,com.example.package2" android:settingsActivity=".SettingsActivity" /> ``` 其中,android:accessibilityEventTypes="typeWindowStateChanged"表示只监听窗口状态改变事件,即应用打开、关闭事件;android:packageNames="com.example.package1,com.example.package2"表示只监听指定应用的打开、关闭事件。 最后,在MyAccessibilityService中重写onAccessibilityEvent方法,处理应用打开事件: ```java public class MyAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { String packageName = event.getPackageName().toString(); if (packageName.equals("com.example.package1")) { // 应用com.example.package1打开了 } else if (packageName.equals("com.example.package2")) { // 应用com.example.package2打开了 } } } @Override public void onInterrupt() { // 中断服务 } } ``` 这样,当用户打开指定的应用时,MyAccessibilityService就会收到相应的AccessibilityEvent,并执行相应的操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值