startActivityForResult, не работающий правильно с launchMode singleInstance

Я хотел бы, чтобы Операции по стеку Activity моего приложения только имели один экземпляр. У меня есть несколько экранов, которые являются ListActivities, и я хотел бы не пройти боль и страдание обновления списков в предыдущем экземпляре ListActivity, когда другой экземпляр того, что ListActivity изменяется (добавленный к, отредактировал, удаленный из, и т.д.) (или есть ли простой способ сделать это?).

Примечание: Я считал, что singleTop выполнит это (хотя он уничтожает Действие при ударе кнопки "Назад") но он не работает. У меня есть меню и если я перехожу к своему экрану Inbox, затем я перехожу к своему экрану QuickList, и затем я перехожу к своему экрану Inbox снова, это создает новое Действие Ящика входящих сообщений.

Прямо сейчас, на моем 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);
                }
            }
        }
    }
}
18
задан Andrew 29 July 2010 в 21:57
поделиться

2 ответа

У меня есть несколько экранов, которые являются ListActivities и я хотел бы не проходить через боль и страдания от обновлять списки в предыдущем экземпляре ListActivity, когда другой экземпляр этой ListActivity изменяется (или есть простой способ сделать это?).

Используйте последовательную модель. Например, ваши данные хранятся в базе данных. Каждый ListActivity имеет Cursor на нужной ему части базы данных. Пусть этот Cursor будет "управляемым курсором" (через startManagingCursor()), и ваши ListViews будут автоматически обновляться в onResume(). Затем вы вносите изменения в свою модель через базу данных.

У меня есть меню, и если я перехожу к экрану "Входящие". экран, затем я перехожу к моему QuickList а затем перехожу к экрану "Входящие снова, то создается новый экран "Входящие Деятельность.

Это то, что он должен делать. Цитируя документацию:

Режимы "standard" и "singleTop" отличаются друг от друга только в одном отношении: Каждый раз, когда возникает новое намерение для "стандартной" деятельности, создается новый экземпляр класса создается для чтобы ответить на это намерение. Каждый экземпляр обрабатывает одно намерение. Аналогично, создается новый экземпляр активности "singleTop" также может быть создан для обработки нового намерение. Однако, если целевая задача уже имеет существующий экземпляр активности на вершине своего стека, этот экземпляр получит новое намерение (в вызове onNewIntent()); новый экземпляр не создается. новый экземпляр не создается. В других обстоятельствах - например, если существующий экземпляр "singleTop" активности находится в целевой задаче, но не на вершине стека, или если он находится на вершине стека, но но не в целевой задаче - новый экземпляр будет создан и помещен в стек.

(жирный шрифт добавлен для выделения)

Прямо сейчас, в моем ListActivities, у меня режим запуска установлен на singleInstance.

Пожалуйста, не делайте этого.

2
ответ дан 30 November 2019 в 08:26
поделиться

Из документации startActivityForResult : «Например, если действие, которое вы запускаете, использует режим запуска singleTask, оно не будет выполняться в вашей задаче, и вы немедленно получите результат отмены». Действия singleInstance аналогичны.

Другими словами, если вы хотите использовать sAFR, вам нужно будет обрабатывать несколько экземпляров активности. Я бы посоветовал сохранить состояние списка для ваших экземпляров ListActivity в onPause в какое-то глобальное место приложения (синглтон или что-то еще) и загружать оттуда в onResume . Затем, даже если будет создано несколько экземпляров ListActivity , верхний всегда будет обновлять данные до того, как будут возобновлены более старые, и списки всегда будут отображаться для пользователя текущими.

Обратите внимание, что вы должны делать это в любом случае, если ваши данные должны быть постоянными, потому что весь ваш процесс может быть остановлен системой в любое время после вызова onPause , и если вы не сохранили любые изменения где-то к моменту его возвращения могут быть незаметно потеряны при некоторых - часто редких и непредсказуемых - обстоятельствах. В этом случае вы хотите использовать локальные файлы или базы данных SQLite, а не сохранять их в сети. onPause должен возвращаться быстро, потому что пользователь не может взаимодействовать с системой во время ее работы, поэтому сохраните ее в локальном хранилище, а затем синхронизируйте с сетью в другое время, возможно, через службу, запущенную onPause .

24
ответ дан 30 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: