Android: как предотвратить запуск нескольких экземпляров активности из виджета? - PullRequest
10 голосов
/ 07 декабря 2011

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

  • пользователь запускает мое приложение (имя корневого действия: "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…///

    }

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

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

openAppIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

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


Также можно использовать:

openAppIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

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

2 голосов
/ 07 декабря 2011

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

openAppIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

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

Для дополнительной справочной информации: Developer.android.com - ОДИН ВЕРХ ФЛАГИ ACTIVITY

Редактировать
Активность запуска - это та, которая имеет следующий фильтр намерений в AndroidManifest.xml

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

Эти флаги не будут работать, если виджет запускает новую ЗАДАЧУ, которая имеет свой собственный стек действий.

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

Дайте нам знать, если найдете что-нибудь.

0 голосов
/ 07 августа 2017

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

android:launchMode="singleInstance"

По сути, это говорит Android о том, что это действие является Горец («Там может быть только один»), и будет препятствовать созданию нескольких экземпляров. При каждом открытии рассматриваемой операции Android либо выводит существующий экземпляр на передний план, либо в некоторых случаях уничтожает и воссоздает текущий экземпляр.

...