安卓中如何监听某些app打开

来源:互联网 发布:域名目录反向解析ip 编辑:程序博客网 时间:2024/05/16 08:54

需求:编写一个程序能够监听到一些app曾经打开并且在程序里面显示是否打开过,比如com.liulishuo.engzo(英语流利说app)的打开;

思路:
首先要有一个Service在后台能够知道任务栈顶端程序是否是com.liulishuo.engzo这样的包名;
如果指定的一个app中包含任务栈顶端的包名,那么就把这个包名和true值存储在SharedPreferences中;
这些app的包名用bindService方式动态传递Service中;

涉及到的知识点:正在running的任务栈知识、Service的bind知识;

WatchDogService.java

public class WatchDogService extends Service {    private List<String> packageList = new ArrayList<>();    private static final String TAG = "WatchDogService";    private static boolean flag = true;// 线程退出的标记    private ActivityManager am;    private SharedPreferences isOpenSP;    private SharedPreferences.Editor editor;    @Override    public void onCreate() {        super.onCreate();        // 服务一旦启动要在后台监视任务栈最顶端应用        am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);        isOpenSP = getSharedPreferences("isOpen", Context.MODE_PRIVATE);        editor = isOpenSP.edit();        new Thread() {            @Override            public void run() {                super.run();                while (flag) {                    synchronized (WatchDogService.class) {                        List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);                        ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);                        ComponentName topActivity = runningTaskInfo.topActivity;                        String packageName = topActivity.getPackageName();                        if (packageList.contains(packageName)) {                            // 判断packageName是否已打开                            boolean isOpen = isOpenSP.getBoolean(packageName, false);                            if (!isOpen) {                                editor.putBoolean(packageName, true);                                editor.apply();                                Log.i(TAG, packageName + "正在存储");                            }                        }                        SystemClock.sleep(500);                    }                    Log.i(TAG, "服务在循环");                }            }        }.start();    }    @Override    public void onDestroy() {        super.onDestroy();        flag = false;    }    public class MyBinder extends Binder implements IMyBinder {        @Override        public void setPackageNames(List<String> packageNames) {            packageList.clear();            packageList.addAll(packageNames);        }    }    MyBinder myBinder = new MyBinder();    @Nullable    @Override    public IBinder onBind(Intent intent) {        return myBinder;    }}

MainActivity.java

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    private TextView textView1;    private SharedPreferences isOpennSP;    private IMyBinder iMyBinder;    private List<String> packageList = new ArrayList<>();    private MyServiceConnection connection;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView1 = (TextView) findViewById(R.id.tv1);        isOpennSP = getSharedPreferences("isOpen", Context.MODE_PRIVATE);        initData();        connection = new MyServiceConnection();        bindService(new Intent(this, WatchDogService.class), connection, Context.BIND_AUTO_CREATE);    }    private void renderView() {        textView1.setText(isOpennSP.getBoolean(packageList.get(0), false) ? packageList.get(0) + "已打开" : packageList.get(0) + "未打开");    }    @Override    protected void onResume() {        super.onResume();        renderView();    }    private void initData() {        packageList.clear();        packageList.add("com.liulishuo.engzo");    }    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(connection);    }    public class MyServiceConnection implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            iMyBinder = (IMyBinder) iBinder;            iMyBinder.setPackageNames(packageList);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    }}

IMyBinder.java

public interface IMyBinder {    void setPackageNames(List<String> packageNames);}

MyApplication.java

public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        startService(new Intent(this, WatchDogService.class));    }}

MainActivity中的bindService方法中携带了connection对象,一旦绑定成功会回调MyServiceConnection类中onServiceConnected方法,我们代码中用到的是第二个参数iBinder对象,这个对象是WatchDogService返回给我们的;

public class MyServiceConnection implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            iMyBinder = (IMyBinder) iBinder;            iMyBinder.setPackageNames(packageList);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    }

再看WatchDogService中的onBind方法中返回了MyBinder对象

public class MyBinder extends Binder implements IMyBinder {        @Override        public void setPackageNames(List<String> packageNames) {            packageList.clear();            packageList.addAll(packageNames);        }    }MyBinder myBinder = new MyBinder();    @Nullable    @Override    public IBinder onBind(Intent intent) {        return myBinder;    }

这个myBinder对象就是从onBind方法中返回的,给了Activity中的MyServiceConnection 中的onServiceConnected方法的第二个参数,我们就是通过这个参数在Activity中去给Service中的packageNames集合赋值的。

0 0
原创粉丝点击