如何在超时情况下控制activity流量在Android以内?

How to control activity flow within Android in timeout situation?

我有一个小型 android 应用程序,它包含 1 个主要 activity(已启动 activity,任何人都可以使用)和一些 另外 3 项活动 需要 登录 和密码。

我创建了一个应用程序 class,用于保存是否有人登录的信息。

此外,在进入activity 5 分钟后,用户将被注销并自动发送到主activity。为此,我在应用程序 class 中创建了一个线程,它会休眠 5 分钟,然后注销用户并启动主线程 activity.

这里是相关代码:

public void setLoggedOut() {
        isLoggedIn = false;
        if (mTimerThread != null) {
            mTimerThread.interrupt();
        }
        Intent myIntent = new Intent(MyApplication.this.getBaseContext(), MainActivity.class);
        myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(myIntent);
    }

startActivity 以上在某些设备(平板电脑)上有效,在其他设备上我收到以下错误并且应用程序崩溃:

android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?

当然我不想要新任务,只是完成所有其他活动并返回主要任务(FLAG_ACTIVITY_CLEAR_TOP 听起来是正确的)。 Whosebug 中已经有线程出现此错误,但没有任何帮助解决我的问题。

如前所述,在某些设备上(甚至在 Android 工作室中模拟)它可以正常工作,但在某些设备上却不能。可能是 API 级别的问题(API 25/Android 7.1.1 有效,API 22/Android 5.1 无效),但我不确定...

我可以(可能)在每个 activity 中单独实现超时机制,但在我看来这不是最好的解决方案,我讨厌在不需要时重复代码。

有什么想法吗? Alternative/better 个概念?

Any ideas? Alternative concepts?

保持当前 activity 上下文并从中开始新的 activity:

public class App extends Application {

    ....

    private WeakReference<Activity> currentActivityRef = null;

    @Override
    public void onCreate() {
        super.onCreate();

        ...

        registerActivityLifecycleCallbacks(
                new ActivityLifecycleCallbacks() {
                    @Override
                    public void onActivityCreated(Activity activity,
                                                  Bundle savedInstanceState) {
                        currentActivityRef = new WeakReference<>(activity);
                    }

                    @Override
                    public void onActivityStarted(Activity activity) {
                        currentActivityRef = new WeakReference<>(activity);
                    }

                    @Override
                    public void onActivityResumed(Activity activity) {
                        currentActivityRef = new WeakReference<>(activity);
                    }

                    @Override
                    public void onActivityPaused(Activity activity) {
                    }

                    @Override
                    public void onActivityStopped(Activity activity) {
                    }

                    @Override
                    public void onActivitySaveInstanceState(Activity activity,
                                                            Bundle outState) {
                    }

                    @Override
                    public void onActivityDestroyed(Activity activity) {
                    }
                }
        );
    }

    ...

    public void setLoggedOut() {
        isLoggedIn = false;
        if (mTimerThread != null) {
            mTimerThread.interrupt();
        }

        if (currentActivityRef != null) {
            final Activity activity = currentActivityRef.get();
            if (activity != null && !(activity instanceof MainActivity)) {
                activity.startActivity(new Intent(activity, MainActivity.class)
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
            }
        }
    }
}