Как контролировать поток активности в пределах Android в ситуации тайм-аута? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть небольшое 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: для вызова startActivity () вне контекста Activity требуется FLAG_ACTIVITY_NEW_TASK флаг. Это действительно то, что вы хотите?

Конечно, я не хочу новую задачу, а просто завершаю sh все остальные действия и go возвращаюсь к основной (FLAG_ACTIVITY_CLEAR_TOP звучит как правый). Здесь уже есть потоки с этой ошибкой в ​​stackoverflow, но нет ничего, что помогло бы решить мою проблему.

Как уже упоминалось на некоторых устройствах (даже эмулируемых в Android studio), он работает должным образом, на некоторых - нет. 'т. Может быть, это вопрос уровня API (API 25 / Android 7.1.1 работал, API 22 / Android 5.1 не работал), но я не уверен ...

Я мог (возможно) реализовать механизм тайм-аута в каждом упражнении в отдельности, но это кажется мне не лучшим решением, я ненавижу дублировать код, когда не требуется.

Есть идеи? Альтернативные / лучшие концепции?

1 Ответ

0 голосов
/ 03 февраля 2020

Есть идеи? Альтернативные концепции?

Сохранить текущий контекст действия и начать с него новое действие:

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));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...