我很好奇Android操作系统中是否有任何方法可以告诉应用程序应用程序刚刚启动。基本上,在我的应用程序中,我想通知我的应用程序即将启动或刚刚启动的应用程序。发生这种情况时,如果用户(使用我的应用程序)将该应用程序包括在阻止列表中,我想执行一些操作,例如阻止该应用程序。任何帮助或指导都将不胜感激。
答案 0 :(得分:1)
首次添加
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(context)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 200);
}
} else {
//Do work
}
if (Settings.System.canWrite(context)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
checkOpsPermissions();
}
}
}
private void checkOpsPermissions() {
if (!hasOpsPermission(this)) {
requestOpsPermission();
} else {
//start your service
}
}
private boolean hasOpsPermission(Context ctx) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AppOpsManager appOps = (AppOpsManager)
ctx.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), ctx.getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
}
return true;
}
private void requestOpsPermission() {
startActivityForResult(
new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 1);
}
您可以获得当前正在这样运行的应用程序
public static String getTopAppName(Context context) {
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String strName = "";
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
strName = getLollipopFGAppPackageName(context);
} else {
strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
} catch (Exception e) {
e.printStackTrace();
}
return strName;
}
private static String getLollipopFGAppPackageName(Context ctx) {
String foregroundProcess = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// try {
UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService(Context.USAGE_STATS_SERVICE);
long milliSecs = 60 * 1000;
Date date = new Date();
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
String topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
foregroundProcess = topPackageName;
}
}
}
//System.out.println("foregroundProcess" + foregroundProcess);
return foregroundProcess;
}
在服务类中使用它,它将在一段时间内运行。
要关闭某些不需要的应用程序,您可以使用
private void closeApp(String a) {
try {
Log.e(TAG, "KILLING here " + a);
ActivityManager am = (ActivityManager) ctx.getSystemService(Activity.ACTIVITY_SERVICE);
am.killBackgroundProcesses(a);
} catch (Exception e) {
e.printStackTrace();
}
}