Верните одноэкземплярное действие обратно с помощью уведомления - PullRequest
1 голос
/ 10 марта 2019

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

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

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

Теперь к проблеме, щелкнув текущее уведомление, снова воссоздается действие B, то есть снова вызывается 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());

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

EDIT

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

<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>

Ответы [ 2 ]

1 голос
/ 13 марта 2019

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

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

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

0 голосов
/ 10 марта 2019

Вам необходимо установить 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());
...