Верните одноэкземплярное действие обратно с помощью уведомления

1

У меня нормальная активность, пусть она называется A, и это первая активность, представляемая пользователю при открытии приложения. Активность А есть кнопка, которая запускает активность, пусть называют это B, с launchMode установлен singleInstance в манифесте. Деятельность B выполняет некоторую обработку.

Пользователи могут нажать кнопку "Домой" и снова открыть приложение, которое представит им начальное действие, то есть действие A. Если пользователи снова нажмут кнопку (в действии A), им будет представлено действие B. В случае действие B не будет перезапущено, т.е. onCreate не будет вызываться, поскольку это singleInstance, чего я и хочу.

Я хочу, чтобы пользователям было легче возвращаться к занятию B, как только оно началось, если они нажали кнопку "Домой". Итак, я создал текущее уведомление, которое позволяет пользователям возвращать активность B. Текущее уведомление будет отменено после завершения действия B.

Теперь проблема заключается в том, что нажатие на текущее уведомление снова воссоздает действие B, т. onCreate вызывается onCreate. Я не знаю, почему поведение здесь не такое, как нажатие на кнопку в действии А. Вот как я создал уведомление:

Intent notifyIntent = new Intent(mContext, CallActivity.class);

PendingIntent notifyPendingIntent = PendingIntent.getActivity(
        mContext, 0, notifyIntent, PendingIntent.FLAG_NO_CREATE);

NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_call_white_18)
        .setContentTitle(title)
        .setContentText(text)
        .setOngoing(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setContentIntent(notifyPendingIntent);

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mContext);
notificationManager.notify(NOTIFICATION_ID, builder.build());

Может кто-нибудь сказать мне, почему это не работает и как я могу заставить его работать так, как я описал?

РЕДАКТИРОВАТЬ

Вот фрагмент моего манифеста:

<application
    android:name="com.mnm.caller.IMApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">
    <activity
        android:name="com.mnm.caller.activities.SplashActivity"
        android:configChanges="orientation|keyboardHidden"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.Splash">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>


    <activity
        android:name="com.mnm.caller.activities.LoginActivity"
        android:configChanges="orientation|keyboardHidden"
        android:theme="@style/AppTheme.NoTitleBar"
        android:screenOrientation="portrait" />

    <activity
        android:name="com.mnm.caller.activities.HomeActivity"
        android:configChanges="orientation|keyboardHidden"
        android:theme="@style/AppTheme.NoTitleBar"
        android:screenOrientation="portrait" />

    <activity
        android:name="com.mnm.caller.activities.CallActivity"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode="singleInstance"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoTitleBar" />


    <service
        android:name="com.mnm.caller.services.IMFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

</application>
Теги:
android-activity
android-notifications

2 ответа

1
Лучший ответ

В комментарии вы написали:

Я на самом деле разрабатываю приложение для звонков. Действие A - домашний экран, а B - вызывающее действие. Я хочу позволить пользователям переходить обратно на домашний экран во время разговора, поэтому я намеренно и сознательно решил создать два экземпляра приложения в последних приложениях (вы можете увидеть точное поведение в приложении для телефона по умолчанию на Android)

Если это так, вы, вероятно, хотите иметь 2 отдельные задачи, между которыми вы можете переключаться. Для этого вам нужно использовать taskAffinity. Ваша CallActivity должна иметь режим запуска singleTask или singleInstance и вы должны установить android:taskAffinity="call" или что-то в этом роде. Чтобы не вводить пользователей в заблуждение, вы должны также предоставить другую android:label и другой android:icon для CallActivity чтобы при появлении этой задачи в списке недавних задач она выглядела иначе, чем остальная часть вашего приложения. Убедитесь, что при запуске CallActivity вы также установили FLAG_ACTIVITY_NEW_TASK. Вы также должны установить этот флаг при создании Notification.

  • 1
    Я попробовал ваше решение, это именно то, что я хотел!
0

Вам необходимо установить FLAG_ACTIVITY_SINGLE_TOP для экземпляра Intent (в вашем случае notifyIntent) перед созданием объекта PendingIntent.

Другими словами:

Intent notifyIntent = new Intent(mContext, CallActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent notifyPendingIntent = PendingIntent.getActivity(
        mContext, 0, notifyIntent, PendingIntent.FLAG_NO_CREATE);

NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_call_white_18)
        .setContentTitle(title)
        .setContentText(text)
        .setOngoing(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setContentIntent(notifyPendingIntent);

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mContext);
notificationManager.notify(NOTIFICATION_ID, builder.build());
  • 0
    Я попробовал это, но не сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню