android监控程序开启与关闭的代码
昨天把思路写下来了,今天上代码:
package org.leepood.monitordemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ActivityManager;
import android.app.Service;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class monitorApp extends Service {
public static final String ACTION="org.leepood.monitordemo.APPS_CHANGED";//自定义动作
private ActivityManager am=null;
private HashMap<String,Integer> appsStored=null;//保存开启和关闭的程序进程名称列表
private final int STARTED_APP=0;//刚开启的程序标记为0
private final int CLOSED_APP=1;//刚关闭的程序标记为1
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
am=(ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
Log.i("service----->", "start");
}
@Override
public void onStart(Intent intent, int startId) {
Thread th_monitor=new Thread(new Runnable(){
@Override
public void run() {
while(true)
{
appsStored=new HashMap<String,Integer>();
/**
* 获取正在运行程序进程名称列表
*/
List<RunningAppProcessInfo> oldrunningapps=am.getRunningAppProcesses();//获取运行的程序
List<String>oldrunningappsprocessnameList=new ArrayList<String>();//保存所有正在运行程序的进程名称
for(RunningAppProcessInfo old:oldrunningapps)
{
oldrunningappsprocessnameList.add(old.processName);
Log.i("old", old.processName);
}
try {
Thread.sleep(1000);//休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 再次获取所有正在运行的程序名称列表
*/
List<RunningAppProcessInfo> newrunningapps=am.getRunningAppProcesses();//再次获取运行的程序
List<String>newrunningappsprocessnameList=new ArrayList<String>();//再次保存所有正在运行程序的进程名称
for(RunningAppProcessInfo newapp:newrunningapps)
{
newrunningappsprocessnameList.add(newapp.processName);
//Log.i("new", newapp.processName);
}
/**
* 开始比对
*/
for(String newapp:newrunningappsprocessnameList)
{
//如果新获取的程序在原来获取的程序列表中则该程序没有变化,否则该程序为刚启动
if(!oldrunningappsprocessnameList.contains(newapp))
{
appsStored.put(newapp,STARTED_APP);
Log.i("newstart",newapp);
}
}
for(String oldapp:oldrunningappsprocessnameList)
{
//如果以前获取的程序在刚刚获取的程序列表中则该程序没有变化,否则该程序为刚关闭
if(!newrunningappsprocessnameList.contains(oldapp))
{
appsStored.put(oldapp,CLOSED_APP);
Log.i("newclose", oldapp);
}
}
//发出广播
if(appsStored.size()!=0)
{
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putSerializable("app_info", appsStored);
intent.putExtra("bundle", bundle);
intent.setAction(ACTION);
monitorApp.this.sendBroadcast(intent);
Log.i("sendbroadcast", "true");
appsStored=null;
}
}
}
});
th_monitor.start();//启动监控线程
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ActivityManager;
import android.app.Service;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class monitorApp extends Service {
public static final String ACTION="org.leepood.monitordemo.APPS_CHANGED";//自定义动作
private ActivityManager am=null;
private HashMap<String,Integer> appsStored=null;//保存开启和关闭的程序进程名称列表
private final int STARTED_APP=0;//刚开启的程序标记为0
private final int CLOSED_APP=1;//刚关闭的程序标记为1
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
am=(ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
Log.i("service----->", "start");
}
@Override
public void onStart(Intent intent, int startId) {
Thread th_monitor=new Thread(new Runnable(){
@Override
public void run() {
while(true)
{
appsStored=new HashMap<String,Integer>();
/**
* 获取正在运行程序进程名称列表
*/
List<RunningAppProcessInfo> oldrunningapps=am.getRunningAppProcesses();//获取运行的程序
List<String>oldrunningappsprocessnameList=new ArrayList<String>();//保存所有正在运行程序的进程名称
for(RunningAppProcessInfo old:oldrunningapps)
{
oldrunningappsprocessnameList.add(old.processName);
Log.i("old", old.processName);
}
try {
Thread.sleep(1000);//休眠一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 再次获取所有正在运行的程序名称列表
*/
List<RunningAppProcessInfo> newrunningapps=am.getRunningAppProcesses();//再次获取运行的程序
List<String>newrunningappsprocessnameList=new ArrayList<String>();//再次保存所有正在运行程序的进程名称
for(RunningAppProcessInfo newapp:newrunningapps)
{
newrunningappsprocessnameList.add(newapp.processName);
//Log.i("new", newapp.processName);
}
/**
* 开始比对
*/
for(String newapp:newrunningappsprocessnameList)
{
//如果新获取的程序在原来获取的程序列表中则该程序没有变化,否则该程序为刚启动
if(!oldrunningappsprocessnameList.contains(newapp))
{
appsStored.put(newapp,STARTED_APP);
Log.i("newstart",newapp);
}
}
for(String oldapp:oldrunningappsprocessnameList)
{
//如果以前获取的程序在刚刚获取的程序列表中则该程序没有变化,否则该程序为刚关闭
if(!newrunningappsprocessnameList.contains(oldapp))
{
appsStored.put(oldapp,CLOSED_APP);
Log.i("newclose", oldapp);
}
}
//发出广播
if(appsStored.size()!=0)
{
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putSerializable("app_info", appsStored);
intent.putExtra("bundle", bundle);
intent.setAction(ACTION);
monitorApp.this.sendBroadcast(intent);
Log.i("sendbroadcast", "true");
appsStored=null;
}
}
}
});
th_monitor.start();//启动监控线程
}
}
上面是代码的关键部位,利用线程来不断获取这一刻运行的进程与前一刻获取的简称比对,如果出现不同的则加以判断得出是新开启的还是刚关闭的.当然,有些程序即使你退出了还是会有进程在运行,所以是无法捕获的.我在用线程来获取运行的程序让其休眠了1秒中,个人觉得还是可以的。好了,这个服务可以通过开机的时候订阅开机广播来启动。要获取程序启动与关闭的信息,可以订阅我定义的这个。恩,附上源码。(本人系菜鸟欢迎各位指出其中的不足)源码下载

浙公网安备 33010602011771号