Android:检测活动何时返回到先前的活动

11

我有一个包含listView的A活动,用户点击任何项目都会启动B活动。根据用户在B活动中执行的操作,可能会更改A活动中的listView。

因此,我的问题是:

当用户从B活动返回A活动时,如何告诉A活动它已经被恢复?

我想要能够在返回A活动时发出刷新A活动中listView的信号。

谢谢!

4个回答

14

您可以在 Activity A 的 onResume() 方法中添加代码来刷新 listview

@Override
protected void onResume() {
    super.onResume();
    //Code to refresh listview
}

5
请注意,这也会在其他场合被调用,例如活动开始、设备旋转等,并不仅限于从活动B返回。 - Marek Lisý

8

使用startActivityForResult是最优雅的方法。每次关闭并重新打开应用程序时,OnResume都会发生,这将使用更多资源,特别是如果您正在刷新大量数据。

在您的活动顶部将请求代码声明为常量:

public static final int OPEN_NEW_ACTIVITY = 123456;

将此代码放在您启动新活动的位置:

Intent intent = new Intent(this, NewActivity.class);
startActivityForResult(intent, OPEN_NEW_ACTIVITY);

当活动完成后执行某些操作。文档建议使用 resultCode,但根据情况,当按钮被按下时,您的结果可以是 RESULT_OKRESULT_CANCELED,因此我会将其省略。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == OPEN_NEW_ACTIVITY) {
        // Refresh your ListView here
        // ....
    }
}

由于某些原因,我在将此内容放入片段时遇到了麻烦。因此,您需要将其放在活动中。

3

我有另一种方法可以做到这一点,在某些情况下可能会很有用 - 我保留了一个私有的Bundle变量,让我们称之为state,当我启动一个活动时,我放置一个字符串,说明我启动了哪个活动:

state.putString("startedActivity", "A");
Intent intent = new Intent(this, ActivityA.class);
startActivity(intent);

我将状态捆绑包存储以保留设备更改(旋转等):
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putAll(state);
}

onCreate方法中,我加载状态:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        savedInstanceState = new Bundle();
    }
    state = savedInstanceState;
}

onResume方法中,我可以检查我刚才是否处于某个Activity。请注意,我立即从状态中删除该字符串,以便在旋转更改等情况下不再显示。

public void onResume() {
    super.onResume();
    if (state.getString(STARTED_ACTIVITY, null) != null) {
        // we just came from another activity!
        state.putString(STARTED_ACTIVITY, null); // clear the state
        // do whatever you need
    }
}

嗯,我做了这个并且它起作用了,但实际上@Muz的回答也可以实现同样的效果,并且更简单,因此如果你需要知道是否真正从子活动返回,就使用他的吧。 - Marek Lisý

2
使用startActivityForResult启动B活动。在A活动的onActivityResult()方法中检查来自B活动的数据。对于listView使用notifyDataSetChanged来更新内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接