25

如果FirstActivity是任务的根,并且它自己完成并启动,SecondActivity那么立即调用将返回,因为完成是异步发生的,因此还没有完成。等待一秒钟,然后调用返回 true。isTaskRoot()SecondActivityfalseFirstActivityisTaskRoot()

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

结果截图

有没有办法...

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

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

4

2 回答 2

1

我遇到了类似的问题,我想严格控制根活动的确切身份。在我的情况下,根只能是我自己的活动之一(不是第 3 方的),所以我能够使用以下方法:

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

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

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

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

于 2013-08-04T06:01:19.490 回答
-3

尝试:

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

我希望这将使 SecondActivity 成为根活动。

于 2013-12-09T05:57:15.037 回答