Android: как предотвратить запуск нескольких экземпляров активности из виджета?

Действия по воспроизведению проблемы:

  • пользователь запускает мое приложение (имя корневой активности: "mainActivity" ) = > экземпляр A mainActivity
  • он нажимает кнопку дома (mainActivity работает в фоновом режиме)
  • он устанавливает виджет относительно этого приложения
  • он нажимает на виджет = > отображается новый экземпляр mainActivity (экземпляр B)
  • он нажимает на кнопку "Назад": пользователь возвращается к активности A (чего я не хочу! Активность B должна быть закрыта (фактически, все приложение должно быть закрыто))

Знаете ли вы, как избежать этой проблемы? (Я видел некоторые аналогичные вопросы о stackoverflow, но не строго, что я хотел)

Спасибо!!!!

Код:

public class MyWidgetProvider extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    // Build the intent to call the service//

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

    Intent openAppIntent = new Intent(context.getApplicationContext(), MainActivity.class);
    openAppIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
    PendingIntent openAppPendingIntent = PendingIntent.getActivity(context, 0, openAppIntent, 0);


    remoteViews.setOnClickPendingIntent(R.id.widgetLinearLayout, openAppPendingIntent);

//// ETC…///

    }

Ответ 1

Попробуйте использовать:

openAppIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

описание здесь.


Вы также можете использовать:

openAppIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

описание здесь.

Ответ 2

Я предлагаю использовать:

openAppIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Это приведет к повторному использованию уже существующих Activity и onNewIntent. Вы можете обновить интерфейс оттуда, если требуется.

Для дополнительной справки: Developer.android.com - FLAG ACTIVITY SINGLE TOP

Изменить
Launcher Activity - это тот, который имеет следующий фильтр намерений в AndroidManifest.xml

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

Эти флаги не будут работать, если виджет запустит новую TASK, у которой есть собственный стек действий.

Я думаю, что лучше всего было бы прочитать эту статью Developer.android.com - ДИЗАЙН ЗАДАЧИ ДЕЯТЕЛЬНОСТИ

Сообщите нам, если вы что-нибудь найдете.

Ответ 3

Ive успешно предотвратил несколько экземпляров активности, добавив этот атрибут в манифест:

android:launchMode="singleInstance"

Это, по сути, говорит Android, что эта деятельность - Highlander ( "Only Only One" ) и предотвратит создание нескольких экземпляров. Всякий раз, когда действие, о котором идет речь, открыто, Android либо приносит существующий экземпляр на передний план, либо в некоторых случаях уничтожает и воссоздает текущий экземпляр.