Подтвердить что ты не робот

Выясните, будет ли текущая деятельность в конечном итоге выполняться в конечном итоге, после того, как незавершенные отделочные операции исчезнут

Если FirstActivity является корнем задачи, и он заканчивается и запускает SecondActivity, то вызов isTaskRoot() в SecondActivity немедленно возвращает false, потому что завершение FirstActivity происходит асинхронно и, следовательно, еще не сделано. Ожидание секунды, а затем вызов isTaskRoot() возвращает true.

public class FirstActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        finish();
        startActivity(new Intent(this, SecondActivity.class));
    }
}
public class SecondActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        ((TextView)findViewById(R.id.tv1))
                .setText("isTaskRoot() in onResume(): " + isTaskRoot());
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                ((TextView)findViewById(R.id.tv2))
                        .setText("isTaskRoot() after 1s: " + isTaskRoot());
            }
        }, 1000);
    }
}

screenshot of the result

Есть ли способ & hellip;

  • (оптимально) узнайте, будет ли в конечном итоге это будет задача root, или

  • (лучше, чем ничего) получить какое-то уведомление/обратный вызов после того, как задача находится в "конечном" состоянии, и, таким образом, isTaskRoot() вернет "правду"?

4b9b3361

Ответ 1

У меня была аналогичная проблема, и я хотел точно контролировать, кто является корневой активностью. В моем случае корень может быть только одним из моих собственных действий (не сторонних), поэтому я смог использовать следующий подход:

Я расширил класс Application, добавил слабую ссылку на активность под названием currentRootActivity и добавил синхронизированный getter и setter.

Тогда я сам справился с этим состоянием, когда действия были созданы/уничтожены. Мой вариант использования был немного особенным, потому что я искал замену одного корня другим, поэтому я точно знал, где reset моя новая переменная состояния, но я уверен, что вы можете сделать то же самое.

Я даже смог добавить эту логику состояния в общий базовый класс для всех своих действий. Так что это было не так отвратительно, как кажется:)

Как упоминалось в комментариях, метод активности isFinishing также может пригодиться.

Ответ 2

Try:

Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Я ожидаю, что это сделает SecondActivity корневую активность.