阻止/禁用最近的应用按钮

时间:2015-06-22 11:37:03

标签: android android-navigation

我知道这个问题在此之前被问到Android Disable Recent Task Button like in 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);
}

但没有运气

7 个答案:

答案 0 :(得分:66)

这样做并不困难。我已经在我的一个应用程序中实现了它,它运行得很好。

第1步

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

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

第2步

将此代码放在您要阻止/禁用最近的应用按钮

的任何Activity
 @Override
 protected void onPause() {
        super.onPause();

        ActivityManager activityManager = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);

        activityManager.moveTaskToFront(getTaskId(), 0);
}

我尝试了几种设备,它运行良好。 按最近的应用按钮可能会使屏幕变黑不到一秒钟,但会重新启动您的活动。

答案 1 :(得分:0)

This answer helped me。它不是最好的,因为现在有些方法已被弃用。它现在适用于我(4.4.2),但我也希望找到更理想的解决方案。

    @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" />

答案 2 :(得分:0)

@Tazz你只是不能。不可能的。

是的,令人沮丧的是,操作系统有时会。我经常遇到这样的问题需要先进的设计,在这里你碰壁了。操作系统不提供此功能,它超出了您的开发人员的能力。这是烦人的但是t-r-u-e,你做不到。即使是赏金也不会将SDK变成魔术。

最终,如果您的应用专用于内部设备 - 而非出版物 - 您可以在Android SDK中更改代码 - 它是开源的。如果您打算在Play商店发布,那就没用了。

答案 3 :(得分:0)

您可以创建一个黑名单,并在其中添加“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;
    }
}

}

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

答案 4 :(得分:0)

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(!hasFocus) {

        Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        sendBroadcast(closeDialog);
    }
}

答案 5 :(得分:0)

var gp = 0;
var ch = 0;

这可能更好但是仍然没有找到任何关闭禁用按钮!

答案 6 :(得分:-1)

一个对我有用的简单技巧(在三星Galaxy S6中)是在调用onStop()时再次启动Activity,因为当用户点击最近的应用按钮时,你的Activity会调用onStop()。

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

建议将Activity标记为singleInstance以避免多个应用实例:

android:launchMode="singleInstance"