安卓中如何监听某些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
- 安卓中如何监听某些app打开
- 如何打开一个app
- Unity app 如何打开商店
- app的某些高度
- 小米华为某些机型存在, Home 键让 APP 后台运行, 重新打开 APP 导致重启的解决方案
- 如何打开itune store上的app
- Android APP如何打开设置中的Activity
- 如何通过网页打开Android APP
- IOS 如何通过浏览器打开App
- unity如何检测第一次打开APP
- 如何打开tomcat的manager app?
- 如何利用openUrl打开另外一个app
- mac中如何在一个app中打开另一个app
- Android 如何从一个APP中打开另外一个APP
- Android 如何从一个APP中打开另外一个APP
- android 开发,如何从自己的APP打开另一个APP
- Android app的activity如何被另一个app打开
- Linux下如何启动、关闭Oracle以及打开关闭监听
- delphi下将中文数字转换为阿拉伯数字
- spring容器归纳(五)
- HDU Problem 4514 湫湫系列故事——设计风景线 【并查集+树的直径】
- 在virtualbox中安装ubuntu遇到问题及方法记录
- ios蓝牙开发学习笔记(一)蓝牙概述
- 安卓中如何监听某些app打开
- Linux防火墙设置端口限制访问
- 【hdu2181】 哈密顿绕行世界问题
- C语言之递归函数
- 《一个操作系统的实现》学习笔记2
- JDBC 实现 含参的增删改查操作
- 静态代码块和构造代码块
- hdu 5792 2016多校5
- hdu 5773 字符串水题