阻止/禁用最近的应用button

我知道这个问题是在这里之前安卓closures最近的任务button像在SureLock ,但由于答案没有工作,也许有些人可以分享一些光在这个被遗忘的物质。

我也试过:

private void closeRecents() { activ.sendBroadcast(new Intent("com.android.systemui.recent.action.CLOSE")); Intent closeRecents = new Intent("com.android.systemui.recent.action.TOGGLE_RECENTS"); closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); ComponentName recents = new ComponentName(SYSTEM_UI_PACKAGE_NAME, RECENTS_ACTIVITY); closeRecents.setComponent(recents); activ.startActivity(closeRecents); } 

但没有运气

Solutions Collecting From Web of "阻止/禁用最近的应用button"

这样做并不困难。 我已经在我的一个应用程序中实现了它,它完美的工作。

步骤1

将此权限添加到manifest.xml文件

 <uses-permission android:name="android.permission.REORDER_TASKS" /> 

第2步

将此代码放置在您想要阻止/禁用最近应用程序button的任何Activity

  @Override protected void onPause() { super.onPause(); ActivityManager activityManager = (ActivityManager) getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(getTaskId(), 0); } 

我已经尝试了几个设备,它是完美的工作。 按最近的应用程序button可能会将屏幕黑屏不到一秒钟,但会使您的活动再次回来。

这个答案帮助了我 。 这不是最好的,因为现在已经废弃了一些方法。 它现在适用于我(4.4.2),但我也希望find一个更理想的解决scheme。

  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { windowCloseHandler.postDelayed(windowCloserRunnable, 250); } } private void toggleRecents() { Intent closeRecents = new Intent("com.android.systemui.recent.action.TOGGLE_RECENTS"); closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); ComponentName recents = new ComponentName("com.android.systemui", "com.android.systemui.recent.RecentsActivity"); closeRecents.setComponent(recents); this.startActivity(closeRecents); } private Handler windowCloseHandler = new Handler(); private Runnable windowCloserRunnable = new Runnable() { @Override public void run() { ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; if (cn != null && cn.getClassName().equals("com.android.systemui.recent.RecentsActivity")) { toggleRecents(); } } }; 

有了这个权限:

 <uses-permission android:name="android.permission.GET_TASKS" /> 

@Tazz你不能 。 不可能。

是的,这是令人沮丧的,有时操作系统。 我经常遇到这样的问题需要先进的devise,在这里你打了一堵墙。 操作系统不提供这个function,它超出了你的开发者的能力。 这是annying,但是,真的,你不能。 即使是赏金也不会把SDK变成魔术。

最终,如果您的应用程序专用于内部设备 – 不是发布 – 您可以更改Android SDK中的代码 – 它是开源的。 如果您打算在Play商店上发布,则无济于事。

一个简单的伎俩,在我的工作(在三星Galaxy S6)是当onStop()被调用时再次启动Activity,因为当用户点击最近的应用程序button时,你的Activity将调用onStop()。

 @Override public void onStop() { startActivity(new Intent(context, YourActivity.class)); } 

build议将您的Activity标记为singleInstance以避免多个应用程序实例:

 android:launchMode="singleInstance" 
 public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(!hasFocus) { Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } 
 public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.d("Focus debug", "Focus changed !"); if(!hasFocus) { Log.d("Focus debug", "Lost focus !"); Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } 

这可能更好,但还没有发现任何closures禁用button!

你可以创build一个黑名单,并在其中添加“com.android.systemui”。然后启动一个服务,打开无限循环检查TopPackageName,如果该黑名单包含它,启动你自己的活动。 如果不清楚,对不起我的英文不好。

和代码:

 public class MyService extends Service{ private HashSet<String> blackPackages = new HashSet<String>(); @Override public void onCreate() { m_black_packages.add("com.android.systemui"); while(true){ if(blackPackages.contains(getTopPackage(MyApplication.context)){ //start you own activity } } } public String GetTopPackage(Context context) { int version=android.os.Build.VERSION.SDK_INT; if(version>=21) { long ts = System.currentTimeMillis(); UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats"); List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats( UsageStatsManager.INTERVAL_BEST, ts - 86400000, ts); if (usageStats == null || usageStats.size() == 0) { return getTopPackageLegacy(context); } Collections.sort(usageStats, mRecentComp); return usageStats.get(0).getPackageName(); } else { return getTopPackageLegacy(context); } } public String getTopPackageLegacy(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); @SuppressWarnings("deprecation") List<RunningTaskInfo> tasks = am.getRunningTasks(1); if (tasks.size() == 0) { return null; } RunningTaskInfo task = tasks.get(0); ComponentName cn = task.topActivity; String package_name = cn.getPackageName(); return package_name; } private static class RecentUseComparator implements Comparator<UsageStats> { @Override public int compare(UsageStats lhs, UsageStats rhs) { return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1; } } 

}

这不是原始代码,而是类似的东西。