在待完成的整理活动消失后,查明当前活动最终是否为任务根

bal*_*pha 24 android android-activity

如果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));
    }
}
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果截图

有没有办法......

  • (最佳地)找出活动最终是否为任务根,或者,

  • (好于什么都没有)一旦任务处于"最终"状态,isTaskRoot()就会得到某种通知/回调,从而返回"真相"?

tal*_*kol 1

我也遇到过类似的问题,我想严格控制根活动到底是谁。就我而言,根只能是我自己的活动之一(而不是第三方活动),因此我可以使用以下方法:

我扩展了该类Application,添加了对名为的活动的弱引用currentRootActivity,并添加了同步 getter 和 setter。

然后,当活动创建/销毁时,我自己管理这个状态。我的用例有点特殊,因为我希望用一个根替换另一个根,所以我确切地知道在哪里重置我的新状态变量,但我很确定你可以做同样的事情。

我什至可以在所有活动的共享基类中添加此状态逻辑。所以这并不像听起来那么恶心:)

正如评论中提到的,活动方法isFinishing也可能派上用场。