当用户按下主页或任务按钮时,我想以编程方式隐藏我的应用程序。用户可以决定应用程序是否在后台持久化,此设置来自后端,因此无论是哪种情况都不会在最近的事件中维护登录前的活动。我试过各种解决方案,有些是部分工作,但没有一个能完美运行。我将列出我使用的所有方法。
第一种方法。手动任务删除 删除所有任务并终止进程
//remove the app from recents. TODO doesn't remove if app list button is pressed instead of home
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ActivityManager am = (ActivityManager) application.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.AppTask> tasks = am.getAppTasks();
if (tasks != null && !tasks.isEmpty()) {
tasks.get(0).setExcludeFromRecents(true);
}
}
} else {
//TODO API 19
}
//kills the process
android.os.Process.killProcess(android.os.Process.myPid());
这种效果相当不错,但是当按下任务按钮时却没有,而不适用于API 19(我定位)
第二种方法:退出活动: 在网络上找到的第一个解决方案。
public class RemoveFromRecentsActivity extends ApplicationLayer {
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if(android.os.Build.VERSION.SDK_INT >= 21)
{
finishAndRemoveTask();
}
else
{
finish();
}
}
public static void exitApplicationAndRemoveFromRecent(Context context)
{
Intent intent = new Intent(context, RemoveFromRecentsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(intent);
}
}
这不起作用,因为我没有从onPause()
调用它,所以它会在应用程序进入后台后执行;我确定这一点,因为它在下次点击图标或从最近恢复时启动虚拟活动。
第三种方法:在第一项活动(Splash)中使用startActivity()
覆盖excludeFromRecents="true"
所以基本上我是一个扩展AppCompatActivity
的活动,我的所有活动都扩展了它。我已覆盖startActivity()
:
@Override
public void startActivity(Intent intent) {
if (isUserOptIn){
if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}
}
super.startActivity(intent);
}
这里我尝试在启动活动上设置excludeFromRecents="true"
,但如果用户选择使用该功能,则应该在将用户带到主页之前创建新任务,但不起作用。无论如何,应用程序都会从最近删除。
第四种方法:在第一项活动(Splash)中使用startActivity()
覆盖excludeFromRecents="false"
@Override
public void startActivity(Intent intent) {
if (!isUserOptIn){
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
}
super.startActivity(intent);
}
在这里我做了相反的事情,Splash in维持在最近,并且EXCLUDE_FROM_RECENTS被添加到每个新活动,但它不起作用。当用户未选择加入时,应用程序不会从最近删除。我还尝试intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
认为该应用未被删除,因为第一项活动有excludeFromRecents="false"
但也没有。
第五种方法:在第一项活动(Splash)中使用startActivity()
覆盖excludeFromRecents="true"
if (! isUserOptIn){
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS );
}
if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );
}
我在Splash中设置excludeFromRecents="true"
并尝试在打开HomeActivity时创建新任务,无论用户选择如何,并在必要时为每个活动添加FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
。这样,应用程序始终被删除。如果我设置excludeFromRecents="false"
,结果相反,它始终保持不变。
似乎intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );
它根本不起作用。
任何人都知道如何做到这一点?
答案 0 :(得分:1)
如果要将应用程序置于后台,Android会调用onUserLeaveHint()
,因为用户按下了HOME或TASK按钮。您可以在该方法中设置标志。 Android接下来会调用onPause()
,您可以在其中检查标记,如果设置了标记,您可以立即拨打finishAndRemoveTask()
。
您应该在所有活动中(或从您派生所有其他活动的基础活动中)实施此行为。
注意:这仅适用于API 21及更高版本
对于API&lt;你可以用这样的东西模拟finishAndRemoveTask()
:
不要拨打finishAndRemoveTask()
,而是执行此操作:
Intent clearIntent = new Intent(this, MyRootActivity.class);
clearIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
clearIntent.putExtra("exit", true);
startActivity(clearIntent);
在根onCreate()
的{{1}}开头(ACTION = MAIN和CATEGORY = LAUNCHER的那个),请执行以下操作:
Activity