У меня нормальная активность, пусть она называется 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>
В комментарии вы написали:
Я на самом деле разрабатываю приложение для звонков. Действие A - домашний экран, а B - вызывающее действие. Я хочу позволить пользователям переходить обратно на домашний экран во время разговора, поэтому я намеренно и сознательно решил создать два экземпляра приложения в последних приложениях (вы можете увидеть точное поведение в приложении для телефона по умолчанию на Android)
Если это так, вы, вероятно, хотите иметь 2 отдельные задачи, между которыми вы можете переключаться. Для этого вам нужно использовать taskAffinity
. Ваша CallActivity
должна иметь режим запуска singleTask
или singleInstance
и вы должны установить android:taskAffinity="call"
или что-то в этом роде. Чтобы не вводить пользователей в заблуждение, вы должны также предоставить другую android:label
и другой android:icon
для CallActivity
чтобы при появлении этой задачи в списке недавних задач она выглядела иначе, чем остальная часть вашего приложения. Убедитесь, что при запуске CallActivity
вы также установили FLAG_ACTIVITY_NEW_TASK
. Вы также должны установить этот флаг при создании Notification
.
Вам необходимо установить 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());