>假设我有一个应用程序,Activity A
将显示帖子及其评论。如果我单击其中一条评论,它将转到Activity B
.因此,Activity B
将显示评论以及对该评论的回复。到目前为止,我没有问题。我只需要为Activity B
设置父Activity
以manifest.xml
Activity A
。
现在,我还有Activity X
,它将显示用户个人资料以及他们所有的帖子和评论。如果我单击评论,它将转到Activity B
.但是,如果我单击向上按钮,它将返回到Activity X
。如何让它回到Activity A
?
顺便说一句,要开始Activity A
,我需要提供额外的数据,其中包含该帖子的 ID,对于每条评论,它们还有一个帖子 ID 的 ID。
是否可以在Activity B
中执行以下操作?
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// if come from Activity A:
NavUtils.navigateUpFromSameTask(this);
// else
Intent intent = new Intent(this, ActivityA.class);
intent.putLong("ID", comment.getPostId());
startActivity(intent);
return true;
default:
}
return super.onOptionsItemSelected(item);
}
还是我应该使用类似TaskStackBuilder
的东西从Activity X
开始Activity B
?
有不同的方法可以做到这一点。我最喜欢的是将必要的信息传递给Intent
,就像这样通过您的设置一样
Intent intent = new Intent();
String caller = getIntent().getStringExtra(CALLER_ACTIVITY);
if (caller.equals(ActivityA.class.getName())) {
NavUtils.navigateUpFromSameTask(this);
return; // dont need to do anything
} else if (caller.equals(ActivityX.class.getName())) {
intent.setClass(this, ActivityA.class);
}
intent.putExtras(getIntent().getExtras()); // if more info needed
startActivity(intent);
finish();
另一种方法是使用getCallingActivity
,但这仅在您使用startActivityForResult()
启动活动时才有效。
如果您使用AppCompat
则可以使用 AppCompat.getReferrer(( 获取调用方
上述选项的行为可能会发生变化,这就是为什么使用 Intent 方式是个好主意的原因。
你会像这样开始ActivityB
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra(ActivityB.CALLER_ACTIVITY, this.getClass().getName());
startActivity(intent);