Android开发——查询/杀死手机里正在运行的进程
0. 前言
以前有同学好像做过一个叫“自习君”的App,开启后自动检测用户这一天的自习时间,在学校里宣传广告还打了不少。其实实现原理非常简单,在SQlite数据库(也可以通过文件)先预置众多应用的PackageName,比如QQ,微信等等,然后开启一个线程,不间断的获取到手机里的所有进程信息,如果检测到其中有processInfo.processName和预置的某个应用的PackageName相同,那么就认定为用户没有在“认真学习”,最后通过网络把数据上传到服务器,加上基于好友功能的“学霸时间”排行榜,最后集成社会化SDK的分享功能,这个App就完成了。
(PS:其实很多功能从技术角度来看,真的很简单。做应用还得看创意点,从这个角度来看的话,有些产品经理做的事情,并不是一个开发者那么容易就可以替代的。(*^__^*) )
最后吐槽一下上面的应用,因为它必定是耗电的,检测进程的子进程必定是频繁进行的(至少是一秒检测一次),不过用这个应用的学霸估计也不怎么玩手机,所以那点耗电估计也不会被在意吧。⊙﹏⊙‖∣
废话不多说,介绍本文的主要内容。本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/51930645
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
@Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
am =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
screenOffReceiver = new ScreenOffReceiver();
registerReceiver(screenOffReceiver,new IntentFilter(Intent.ACTION_SCREEN_OFF));
super.onCreate();
} @Override
public void onDestroy() {
unregisterReceiver(screenOffReceiver);
screenOffReceiver = null;
super.onDestroy();
}
private class ScreenOffReceiver extends BroadcastReceiver{
@Override
public 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开发——查询/杀死手机里正在运行的进程的更多相关文章
- Android开发——查询/卸载手机里的应用、应用图标创建
1. 获取手机里的所有已安装的应用 以前写过一个SoftProviderUtil工具类,拿出来分享一个.通过PackageManager,不仅可以获取PackageName,判断此进程是否为系统应用, ...
- Android开发之获取手机SIM卡信息
TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设 ...
- Android开发学习之路-Android6.0运行时权限
在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用.这对于用户来说,无疑是一个提升安全性的做法.那么对于开发者,应该怎 ...
- android开发 BaseAdapter中getView()里的3个参数是什么意思
BaseAdapter适配器里有个getView()需要重写public View getView(int position,View converView,ViewGroup parent){ // ...
- Android开发:修改eclipse里的Android虚拟机路径
一.发现问题: 今天打开电脑发现C盘缩了不少,这才意识到:eclipse里配置的安卓虚拟机默认放在了C盘里. 当然,在不同的电脑上可能路径有所不同,我的默认路径是:C:\Users\lenovo\.a ...
- Android 开发工具类 33_开机自运行
原理:该类派生自 BroadcastReceiver,重载方法 onReceive ,检测接收到的 Intent 是否符合 BOOT_COMPLETED,如果符合,则启动用户Activity. imp ...
- Android开发之控制手机音频
本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频.关于AudioManager的具体解释可參照:Android开发之AudioManager(音频管理器)具体解释 ...
- Android开发之布局文件里实现OnClick事件关联处理方法
一般监听OnClickListener事件,我们都是通过Button button = (Button)findViewById(....); button.setOClickLisener....这 ...
- Android开发:在布局里移动ImageView控件
在做一个app时碰到需要移动一个图案的位置,查了一上午资料都没找到demo,自己写一个吧 RelativeLayout.LayoutParams lp = new RelativeLayout.Lay ...
随机推荐
- vs2015未能正确加载“ProviderPackage”包
出现以下错误的解决方案 ---------------------------Microsoft Visual Studio---------------------------未能正确加载“Prov ...
- 转 OGG Troubleshooting-Database error 1 (ORA-00001: unique constraint ...)
Q5: After imp data to target, when we start replc process, we find the following error: 2011-11-10 0 ...
- webkit滤镜
-webkit-filter: grayscale(1);/*灰度*/ -webkit-filter: sepia(1);/*褐色*/ -webkit-filter: saturate(1);/*饱和 ...
- AJPFX关于集合的几种变量方式
package com.java.test; import java.util.ArrayList;import java.util.Enumeration;import java.util.Iter ...
- LN : leetcode 215 Kth Largest Element in an Array
lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...
- 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...
- php 缓存工具类 实现网页缓存
php 缓存工具类 实现网页缓存 php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存 一.文件缓存 二.数据查询结果缓存,使用内存来实现高速缓存 本 ...
- 10个顶级的CSS3代码生成器
新出来的在线工具和web应用允许开发人员快速创建网站,而无需手动一行一行地编写代码.当前,不断有新的框架和代码库涌现在前端开发这个领域里. 但是,这也让许多开发人员忘记了代码生成器以及它们在构建网站时 ...
- 手写MVVM框架 之vue双向数据绑定原理剖析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- centos开机直接进入命令行
找到文件,/etc/inittab 文件,在下面有一行 id:5:initdefault: 将上面的5改成3就可以了 5是图形界面 3是命令行界面 就是文本界面.