0. 前言

以前有同学好像做过一个叫“自习君”的App,开启后自动检测用户这一天的自习时间,在学校里宣传广告还打了不少。其实实现原理非常简单,在SQlite数据库(也可以通过文件)先预置众多应用的PackageName,比如QQ,微信等等,然后开启一个线程,不间断的获取到手机里的所有进程信息,如果检测到其中有processInfo.processName和预置的某个应用的PackageName相同,那么就认定为用户没有在“认真学习”,最后通过网络把数据上传到服务器,加上基于好友功能的“学霸时间”排行榜,最后集成社会化SDK的分享功能,这个App就完成了。

(PS:其实很多功能从技术角度来看,真的很简单。做应用还得看创意点,从这个角度来看的话,有些产品经理做的事情,并不是一个开发者那么容易就可以替代的。(*^__^*)  )

最后吐槽一下上面的应用,因为它必定是耗电的,检测进程的子进程必定是频繁进行的(至少是一秒检测一次),不过用这个应用的学霸估计也不怎么玩手机,所以那点耗电估计也不会被在意吧。⊙﹏⊙‖∣

废话不多说,介绍本文的主要内容。本文原创,转载请注明出处:Android开发——查询/杀死手机里正在运行的进程_SEU_Calvin的博客-CSDN博客

1. 获取手机里的所有进程信息

以前写过一个ProcessInfoProviderUtil工具类,拿出来分享一个。通过Context.ACTIVITY_SERVICE和PagerManager不仅可以获取上面APP所需的进程名(也是PackageName),判断此进程是否为系统进程,还可以获取到该进程所占用的内存大小,应用名称以及应用图标。代码如下。其中ProcessInfo为自定义的业务类,成员变量即为要获取的信息,加上set/get方法即可。

/*** For Info of Process* Created by Calvin on 2016/4/24.*/
public class ProcessInfoProviderUtil {public  static List<ProcessInfo> getProcessInfos(Context context){//创造要返回的集合List<ProcessInfo> list = new ArrayList<ProcessInfo>();PackageManager pm = (PackageManager)context.getPackageManager();//拿到手机里的所有进程信息ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for(ActivityManager.RunningAppProcessInfo processInfo : runningAppProcesses) {//要添加的对象ProcessInfo info = new ProcessInfo();//包名即为进程名字String packageName = processInfo.processName;info.setPackageName(packageName);//以进程号为参数,获得进程的信息(内存占用的大小)//使用时通过Formatter.formatFileSize(this,SystemProcessUitl.getAvaMemory(this))转换为MB即可Debug.MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{processInfo.pid});long totalPrivateDirty = processMemoryInfo[0].getTotalPrivateDirty()*1024l;info.setSize(totalPrivateDirty);//应用名字和图标ApplicationInfo applicationInfo = null;try {applicationInfo = pm.getApplicationInfo(packageName, 0);String name = applicationInfo.loadLabel(pm).toString();info.setName(name);Drawable icon = applicationInfo.loadIcon(pm);info.setIcon(icon);if ( (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)== 0 ){//用户进程info.setUesrProcess(true);}else {//系统进程info.setUesrProcess(false);}} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}if(info.getName()!=null) {list.add(info);}}return list;}
}

2. 杀死指定的进程

杀死进程很简单。其实就是调用ActivityManager的killBackgroundProcesses方法,这里我做了一个优化,即监听锁屏广播,在服务里创建内部广播接收者,锁屏后即循环杀死所有的进程。实现代码如下。当然,系统进程是不会被杀死的。这样就做到了一点省电优化。当然,自己需要的,即便是锁屏也想保持运行的后台进程,可以自定义一个集合维护需要被保护的进程,杀死之前自行判断即可。

/*** Service used to kill all user process when lock the phone* Created by user on 2016/4/26.*/
public class AutoCleanService extends Service {private  ScreenOffReceiver screenOffReceiver;private ActivityManager am;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {am =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);screenOffReceiver = new ScreenOffReceiver();registerReceiver(screenOffReceiver,new IntentFilter(Intent.ACTION_SCREEN_OFF));super.onCreate();}@Overridepublic void onDestroy() {unregisterReceiver(screenOffReceiver);screenOffReceiver = null;super.onDestroy();}private  class ScreenOffReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo info : runningAppProcesses){//进程名字  即为包名String processName = info.processName;//杀掉可以杀的am.killBackgroundProcesses(processName);}}}
}

Android开发——查询/杀死手机里正在运行的进程相关推荐

  1. Android开发——查询/卸载手机里的应用、应用图标创建

    1. 获取手机里的所有已安装的应用 以前写过一个SoftProviderUtil工具类,拿出来分享一个.通过PackageManager,不仅可以获取PackageName,判断此进程是否为系统应用, ...

  2. android 判断安装微信,Android开发中判断手机是否安装了QQ或者微信

    下面一段代码给大家分享了android中判断手机是否安装了qq或者微信,代码简单易懂,非常不错,具有参考借鉴价值,需要的的朋友参考下吧 public static boolean isWeixinAv ...

  3. (转)解决android开发人员,手机app图标显示不正确问题

    (转)解决android开发人员,手机app图标显示不正确问题 参考文章: (1)(转)解决android开发人员,手机app图标显示不正确问题 (2)https://www.cnblogs.com/ ...

  4. Android开发图标适配手机方案

    Android开发图标适配手机方案 在Android入门的时候并没有太多考虑上述问题,甚至在做案列的时候图片或者图标显示在手机上是比较模糊,这对于用户来说是非常影响使用舒适度的. 解决方案如下: 先准 ...

  5. android开发 判断当前手机是否是阿里 yunOS 系统

    android开发 判断当前手机是否是阿里 yunOS 系统 调用此方法, 返回ture,就是yunOS系统 返回false,就是非yunOS系统 @SuppressLint({"Defau ...

  6. Android开发实战《手机安全卫士》——11.“进程管理”模块拓展 窗体小部件 生成快捷方式

    文章目录 1.进程管理--隐藏系统进程 2.进程管理--锁屏清理 3.拓展功能--生成快捷方式 4.高级工具--常用号码查询(布局实现) 5.高级工具--常用号码查询(逻辑实现) 6.拓展功能--窗体 ...

  7. 当Android开发遇到魅族手机

    这是我的第一篇博客,对于一个博客小白来说,真不知道写写什么,那么我就在这记录下我在Android开发中遇到的一些奇葩事吧! 直奔主题:不知道大家在Android开发中有没有遇到这种情况,在自己手机中运 ...

  8. Android开发实战《手机安全卫士》——10.“进程管理”模块实现 PopupWindow 内存清理

    文章目录 1.软件管理--PopupWindow的使用 2.软件管理--PopupWindow的动画 3.软件管理--卸载应用 & 启动应用 & 分享应用 4.进程管理--布局实现 5 ...

  9. Android开发之获取手机SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于访问有关设 ...

最新文章

  1. 过去50年最重要的统计学思想!
  2. 传承德艺之馨——上海文联第八次代表大会侧记
  3. php ci hooks,CI框架 -- 核心文件 之 Hooks.php
  4. android ListView适配器之SimpleAdapter的用法
  5. boost::fibers::launch::dispatch的测试程序
  6. Vim的新一代补全插件:coc.nvim
  7. 相对完善的Java通过JDBC操纵mysql的例子
  8. 笔记本(华硕UL80VT)软件超频setFSB
  9. jsapi.php 参数设置,统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!...
  10. Python学习笔记11:标准库之文件管理(os包,shutil包)
  11. Python日期类的实现
  12. Windows2000 VMware Tools KB835732 补丁包
  13. 数字电路基础知识——时序逻辑电路之存储器(SRAM、DRAM、ROM)
  14. 《因果推理原理:基础与学习算法》第一章 因果模型和统计模型
  15. 填坑---override、overload、overwrite
  16. 重命名多个图片文件,并修改图片后缀名
  17. 链接服务器“(null)“的 OLE DB 访问接口 “SQLNCLI10“ 返回了消息 “客户端无法建立
  18. Android内存优化之图片优化
  19. SPSS教程:数据不符合正态分布,如何统计描述
  20. Numpy+Pandas+Matplotlib学习

热门文章

  1. 解决:ipad QQ可以联网,浏览器不能联网
  2. 安全漏洞之SQL注入和shell注入
  3. AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境
  4. Java面试汇总+答案
  5. 阿里云ACP认证之云服务器ECS知识整理(考题占比 31%)
  6. Android 知识点——Method put in org.json.JSONObject not mocked
  7. vertica MySQL_MySQL数据库之Vertica数据库的用法
  8. linux 截取某一段时间的日志,存储到另一个文件中
  9. 对不起,今年我真的不敢去拜年了。。。
  10. 看了第一句,有人就哭了?