【问题标题】:How to control activity flow within Android in timeout situation?如何在超时情况下控制 Android 内的活动流?
【发布时间】:2020-05-18 16:52:23
【问题描述】:

我有一个小型 android 应用程序,其中包含 1 个主要活动(已启动的活动,任何人都可以使用)和一些 3 个其他活动,需要 登录 带有密码。

我创建了一个应用程序类来保存某人是否登录的信息。

此外,用户应在 5 分钟不活动后退出并自动发送到主要活动。为此,我在应用程序类中创建了一个线程,该线程会休眠 5 分钟,然后注销用户并调出主要活动。

这里是相关代码:

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 听起来是正确的)。 stackoverflow 中已经有出现此错误的线程,但没有任何帮助解决我的问题。

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

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

有什么想法吗?替代/更好的概念?

【问题讨论】:

    标签: android timeout


    【解决方案1】:

    有什么想法吗?替代概念?

    保留当前活动上下文并从中开始新活动:

    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));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2017-12-05
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多