Выясните, будет ли текущая деятельность в конечном итоге выполняться в конечном итоге, после того, как незавершенные отделочные операции исчезнут
Если 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()
вернет "правду"?
Ответы
Ответ 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 корневую активность.