转载请标明出处:http://www.jianshu.com/u/a5ad093cffe8
上节说到获取手机安装APP列表的方法,(文章:http://www.jianshu.com/p/f2a8ff92e6a0)
本章讲一下关于获取某个APP的运行状态。
最近的一个需求,需要检测某个APP的运行状态,来进行一些相应的操作。网上的一些资料都特别的零碎。我在这里总结一下。
效果图:
运行效果图 检测效果图从效果图中可以看到,当项目运行后,服务将会监控某个APP的运行状态。是否是前台运行。
直接上代码:
添加权限
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.GET_TASKS" />
判断工具类IsAppRuning:
package com.example.gray_dog3.applist;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Log;
import java.util.List;
import static com.example.gray_dog3.applist.ApkTool.TAG;
/**
* Created by liupanpan on 2017/3/28.
*/
public class IsAppRuning {
/**
* 方法描述:判断某一应用是否正在运行
* Created by cafeting on 2017/2/4.
*
* @param context 上下文
* @param packageName 应用的包名
* @return true 表示正在运行,false 表示没有运行
*/
public static boolean isAppRunning(Context context, String packageName) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();
if (list.size() <= 0) {
return false;
}
for (ActivityManager.RunningAppProcessInfo info : list) {
if (info.importance == 100 && info.processName.equals(packageName)) {
return true;
}else {
return false;
}
}
return false;
}
//获取已安装应用的 uid,-1 表示未安装此应用或程序异常
public static int getPackageUid(Context context, String packageName) {
try {
ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
if (applicationInfo != null) {
Log.d(TAG, "getPackageUid: " + applicationInfo.uid);
return applicationInfo.uid;
}
} catch (Exception e) {
return -1;
}
return -1;
}
/**
* 判断某一 uid 的程序是否有正在运行的进程,即是否存活
* Created by cafeting on 2017/2/4.
*
* @param context 上下文
* @param uid 已安装应用的 uid
* @return true 表示正在运行,false 表示没有运行
*/
public static boolean isProcessRunning(Context context, int uid) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200);
if (runningServiceInfos.size() > 0) {
for (ActivityManager.RunningServiceInfo appProcess : runningServiceInfos) {
if (uid == appProcess.uid) {
return true;
}
}
}
return false;
}
public boolean IsAppRuning(Context context, String packageName) {
int uid = getPackageUid(context, packageName);
if (uid > 0) {
boolean rstA = isAppRunning(context, packageName);
boolean rstB = isProcessRunning(context, uid);
if (rstA || rstB) {
return true;
} else {
//指定包名的程序未在运行中
return false;
}
} else {
//应用未安装
return false;
}
}
}
启动服务监控APP运行状态:
package com.example.gray_dog3.applist;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.util.concurrent.TimeUnit;
/**
* Created by liupanpan on 2017/3/28.
*/
public class TopSevers extends Service {
public static final String TAG = "TestService";
private MyThread myThread = null;
private static class MyThread extends Thread {
private Context context;
private boolean isRun = true;
private MyThread(Context context) {
this.context = context;
}
public void setStop() {
isRun = false;
}
@Override
public void run() {
while (isRun) {
try {
TimeUnit.SECONDS.sleep(2);
//此处的isAppruning(context,pakgename);pakgename 为你需要检测的APP包名。
if (new IsAppRuning().isAppRunning(context, "com.example.gray_dog3.applist")) {
//Toast.makeText(context, "com.example.gray_dog3.applist正在运行", Toast.LENGTH_SHORT).show();
Log.e("usrun", "运行中");
} else {
// Toast.makeText(context, "com.example.gray_dog3.applist失败=========", Toast.LENGTH_SHORT).show();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
myThread = new MyThread(this);
myThread.start();
Log.i(TAG, "Service is start.");
}
@Override
public void onDestroy() {
super.onDestroy();
myThread.setStop();
Log.i(TAG, "Service is stop.");
}
}
到此就可以实现了。
源码后期将会奉上。
关注公众号:
网友评论