安卓5.0上下应用锁的实现方法
2017-06-26 本文已影响234人
让我爱胡蝶
- 应用锁简单介绍
本文仅讨论如何获得最近运行应用
这里的应用锁的功能是指的是禁止打开某些特定的应用,或者打开后也会自动关闭。
简单的介绍一下应用锁实现的方式:后台开一个Service,是Service里开一个Runnable,在实现中每过几秒检测当前应用是否可以打开。 - 顶层应用
- 5.0以下可以直接获取顶层应用。
需要声明<uses-permission android:name="android.permission.GET_TASKS"/>
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
if (!ListUtils.isEmpty(tasksInfo)) {
retuString = tasksInfo.get(0).topActivity.getPackageName();
}
- 5.0以上需要
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"></uses-permission>
这个权限虽然说是系统权限,但是可以用下面的方法申请到。
/***
* 有没有这个设置,必须要开启这个设置才能得到最近任务
* @param pContext 上下文
* @return true有false没有
*/
public static boolean isUsageOption(Context pContext) {
PackageManager packageManager = pContext.getApplicationContext()
.getPackageManager();
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
/***
* 当前的状态
* @param pContext 上下文
* @return true开启false关闭
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static boolean isUsageSwitch(Context pContext) {
long ts = System.currentTimeMillis();
UsageStatsManager usageStatsManager = (UsageStatsManager) pContext.getApplicationContext()
.getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_BEST, 0, ts);
if (queryUsageStats == null || queryUsageStats.isEmpty()) {
return false;
}
return true;
}
/***
* 打开权限界面
* @param pContext 上下文
* @param requestCode 请求码
*/
public static void openUsageActivity(Context pContext, int requestCode) {
if (pContext == null) {
throw new RuntimeException(UsageStatsUtils.class.getName() + " context null");
}
Intent intent = new Intent(
Settings.ACTION_USAGE_ACCESS_SETTINGS);
if (pContext instanceof Activity) {
((Activity) pContext).startActivityForResult(intent, requestCode);
}
}
申请到权限后才能使用下面的方法获取最近任务。(但不是很准确,如果在设定的时间内没有任何操作,那么取到的最任务为空)。
UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, time - 5 * 1000, time);//检查5秒内的应用情况
if (appList != null && appList.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : appList) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
retuString = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
当前检测到当前应用允许运行时,可以执行以下操作打开默认桌面。
```
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);