gpt4 book ai didi

android - startActivityForResult 无法与 launchMode singleInstance 一起正常工作

转载 作者:IT王子 更新时间:2023-10-28 23:37:14 26 4
gpt4 key购买 nike

我希望我的应用程序的 Activity 堆栈上的 Activity 只有一个实例。我有几个屏幕是 ListActivities,当 ListActivity 的另一个实例被更改(添加到、编辑、删除等)时,我不想经历更新 ListActivity 的前一个实例中的列表的痛苦和痛苦(或者有什么简单的方法可以做到这一点?)。

注意:我已经读过 singleTop 会完成这个(虽然如果你点击后退按钮它会破坏 Activity),但它不起作用。我有一个菜单,如果我转到我的收件箱屏幕,然后我转到我的快速列表屏幕,然后我再次转到我的收件箱屏幕,它会创建一个新的收件箱 Activity 。

现在,在我的 ListActivities 上,我已将 launchMode 设置为 singleInstance。问题是:如果我使用 startActivityForResult 启动另一个 Activity,onActivityResult 处理程序会立即触发(在创建新 Activity 之前)。当我在下一个屏幕上执行必要的操作以返回结果时,onActivityResult 处理程序不会触发。

发生了什么事?

这是我触发新 Activity 的方式:

Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class);
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);

这是我返回结果的方式:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
QuickListItem qlItem = m_Adapter.getItem(position);
if (qlItem != null && qlItem.getQLId() != -1) {
Intent data = new Intent();
data.putExtra("ql_id", qlItem.getQLId());
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
}
else {
getParent().setResult(Activity.RESULT_OK, data);
}
}
finish();
}

这是我的 onActivityResult 处理程序:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_QUICKLIST) {
if (resultCode == Activity.RESULT_OK) {
Bundle extras = data.getExtras();
if (extras != null) {
int id = extras.getInt("ql_id");
if (id > 0) {
launchQLItemsThread(id);
}
}
}
}
}

最佳答案

来自 startActivityForResult 的文档: "例如,如果您正在启动的 Activity 使用 singleTask 启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果。"singleInstance Activity 也是一样的。

换句话说,如果您想使用 sAFR,您将需要处理多个 Activity 实例。我的建议是为您的 ListActivity 存储列表状态。 onPause 中的实例到某个应用程序全局点(单例或其他),并从那里加载 onResume .那么,即使多个 ListActivity实例将被创建,顶部的实例将始终在旧实例恢复之前更新数据,并且列表将始终对用户显示为最新的。

请注意,如果您的数据是持久的,那么无论如何您都应该这样做,因为您的整个进程可能会在 onPause 之后的任何时间被系统终止。调用,并且如果您在返回时尚未在某处保存任何更改,则它们很可能在某些(通常是罕见且不可预测的)情况下默默地丢失。在这种情况下,您希望使用本地文件或 SQLite 数据库,而不是持久化到网络。 onPause需要快速返回,因为用户在系统运行时无法与系统交互,所以保存到本地存储,然后在其他时间同步到网络,可能通过 onPause 启动的服务.

关于android - startActivityForResult 无法与 launchMode singleInstance 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com