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

Android startActivityForResult无法与launchMode singleInstance一起正常工作,android,android-activity,single-instance,Android,Android Activity,Single Instance,我希望应用程序活动堆栈上的活动只有一个实例。我有几个屏幕都是ListActivity,我不想在ListActivity的另一个实例被更改(添加到、编辑、删除等)时经历更新ListActivity的前一个实例中的列表的痛苦(或者有一种简单的方法可以做到这一点吗?) 注意:我已经读到singleTop可以实现这一点(尽管如果您点击后退按钮,它会破坏活动),但它不起作用。我有一个菜单,如果我进入收件箱屏幕,然后进入快速列表屏幕,然后再次进入收件箱屏幕,它会创建一个新的收件箱活动 现在,在我的ListA

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

注意:我已经读到singleTop可以实现这一点(尽管如果您点击后退按钮,它会破坏活动),但它不起作用。我有一个菜单,如果我进入收件箱屏幕,然后进入快速列表屏幕,然后再次进入收件箱屏幕,它会创建一个新的收件箱活动

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

发生了什么事

以下是我启动新活动的方式:

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
的文档中可以看出:“例如,如果您正在启动的活动使用单任务启动模式,它将不会在您的任务中运行,因此您将立即收到取消结果。”
singleInstance
活动的方式相同

换句话说,如果要使用sAFR,则需要处理多个活动实例。我的建议是将
ListActivity
实例的列表状态存储在
onPause
中的某个应用程序全局点(单件或任何东西),然后从那里加载到
onResume
。然后,即使创建了多个
ListActivity
实例,最上面的实例也会在旧实例恢复之前更新数据,并且列表对用户来说总是最新的

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

我有几个屏幕是 我不想去 经历了生命的痛苦和折磨 在以前的列表中更新列表 ListActivity的实例 该列表活动的另一个实例 改变了(或者有没有简单的方法 这样做吗?)

使用一致的模型。例如,您的数据可能位于数据库中。每个
ListActivity
在其所需的数据库部分上都有一个
光标。将
光标
设为“托管光标”(通过
startManagingCursor()
),您的
列表视图将在
onResume()
中自动更新。然后通过数据库对模型进行更改

我有菜单,如果我去我的收件箱 屏幕,然后我转到我的快速列表 屏幕,然后我进入我的收件箱 再次显示屏幕时,它会创建一个新的收件箱 活动

这就是它应该做的。引述:

“标准”和“单顶”模式 在一个方面彼此不同 尊重:每次有新的意图 对于“标准”活动,新的 类的实例被创建为 对这一意图作出反应。每个实例 处理单一意图。同样,一个 “单顶”活动的新实例 也可以创建以处理新的 意图但是,如果目标任务 已具有的现有实例 位于堆栈顶部的活动, 该实例将接收新的 意图(在onNewIntent()调用中);A. 未创建新实例In 其他情况-例如,如果 的现有实例 “singleTop”活动位于目标中 任务,但不在堆栈的顶部, 或者如果它在堆栈的顶部,但是 不在目标任务中-新任务 实例将被创建和推送 在堆栈上。

(增加黑体字以强调)

现在,在我的ListActivities中,我已经将launchMode设置为singleInstance


请不要这样做。

谢谢您的回复。我知道你想让我做什么,但是,这不会引起问题吗?显然,我需要在onSaveInstanceState和onRestoreInstanceState处理程序中执行相同的操作。如果在onResume和onPause上我从数据库中读取并保存信息,我的应用程序将不必要地从数据库中读取并从SavedInstanceState读取,如果它碰到onRestoreInstanceState处理程序,是吗?另外,这真的是Android开发者的常见做法吗?是否将ListActivity的多个实例的ListActivity数据保存到单个实例?再次感谢您的帮助。另外,您能解释一下为什么singleTop不适合我吗?或者我不明白吗?SavedInstanceState仅用于恢复活动特定实例的状态;使用它来保存滚动位置等,而不是列表内容。您要做的是让活动的所有实例共享某个状态,因此,如果该状态是持久的,则希望将其放在数据库中;如果该状态只是来自网络的数据缓存,则希望将其放在静态成员中。根据你所说的,我建议后者;只要用一个DB来保存你将来仍然需要通过网络发送的数据,这样你就不会丢失它。我想我会把所有的东西都扔掉