安卓中如何监听某些app打开
2016-08-02 17:17
190 查看
需求:编写一个程序能够监听到一些app曾经打开并且在程序里面显示是否打开过,比如com.liulishuo.engzo(英语流利说app)的打开;
思路:
首先要有一个Service在后台能够知道任务栈顶端程序是否是com.liulishuo.engzo这样的包名;
如果指定的一个app中包含任务栈顶端的包名,那么就把这个包名和true值存储在SharedPreferences中;
这些app的包名用bindService方式动态传递Service中;
涉及到的知识点:正在running的任务栈知识、Service的bind知识;
WatchDogService.java
MainActivity.java
IMyBinder.java
MyApplication.java
MainActivity中的bindService方法中携带了connection对象,一旦绑定成功会回调MyServiceConnection类中onServiceConnected方法,我们代码中用到的是第二个参数iBinder对象,这个对象是WatchDogService返回给我们的;
再看WatchDogService中的onBind方法中返回了MyBinder对象
这个myBinder对象就是从onBind方法中返回的,给了Activity中的MyServiceConnection 中的onServiceConnected方法的第二个参数,我们就是通过这个参数在Activity中去给Service中的packageNames集合赋值的。
思路:
首先要有一个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集合赋值的。
相关文章推荐
- android:如果手机安装了app则打开一个activity,如果没有安装则去到android market如何在HTML页面实现
- 如何打开itune store上的app
- 如何解决多次打开CameraDshowApp.exe系统死机的问题(高分辨率camera)
- android安卓如何实现单击提示“再按一次退出”,双击退出,实现双击监听
- android安卓如何实现单击提示“再按一次退出”,双击退出,实现双击监听
- VB:如何监听打开的窗口和程序
- 详谈:安卓App容易反编译,如何保你开发者App安全无忧!
- 如何用自己的app打开email 附件
- 如何检查用户的ios设备上是否安装了某些app?
- 如何用iphone、安卓等智能手机打开ecshop正常显示,屏蔽wap功能
- 如何解决多次打开CameraDshowApp.exe系统死机的问题(高分辨率camera)
- 如何自定义协议从自己的一个app打开另一个app
- 如何自定义协议从自己的一个app打开另一个app
- iOS 7 如何关闭已打开的应用(App)
- 如何找出内含安卓消息推送广告的app,立波手把手教会你
- 【android 应用】Android(安卓)APP(应用)如何推广?整理
- 看看安卓开发者在APP推广路途中是如何被金山“恶霸”所“黑打”的!
- 如何用VB监听已被其它程序打开的串口
- 如何通过Html网页调用本地安卓app?
- 如何通过Html网页调用本地安卓app