我知道这个问题在此之前被问到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);
}
但没有运气
答案 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"