当用户按下主页或任务按钮时,我想以编程方式隐藏我的应用程序。用户可以决定应用程序是否在后台持续存在,此设置来自后端,因此在任何一种情况下都不会维护登录前活动。我尝试了各种解决方案,有些可以部分工作,但没有一个可以完美工作。我将列出我使用的所有方法。
第一种方法。手动删除任务: 删除所有任务并杀死进程
//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(我的目标)时
第二种方法: ExitActivity:在网上找到的第一个解决方案。
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()
,所以它在应用程序进入后台后执行;我确信这一点,因为它会在我下次单击该图标或从最近恢复它时启动虚拟活动。
第三种方法:startActivity()
在第一个活动中覆盖excludeFromRecents="true"
(Splash)
所以基本上我有一个扩展的活动,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 Activity,但是如果用户选择了使用该功能,则在将用户带到主页之前应该创建一个新任务,但不起作用。无论如何,应用程序都会从最近删除。
第四种方法:startActivity()
在第一个活动中覆盖excludeFromRecents="false"
(Splash)
@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"
但也没有工作。
第五种方法:startActivity()
在第一个活动中覆盖excludeFromRecents="true"
(Splash)
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 );
}
在这里,我excludeFromRecents="true"
在 Splash 中设置并尝试在打开 HomeActivity 时创建一个新任务,无论用户的选择如何,并FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
在必要时添加到每个活动中。这样应用程序总是被删除。如果我设置相反的结果excludeFromRecents="false"
,它总是保持不变。
似乎intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );
它根本不起作用。
任何人都知道如何做到这一点?