使用通知带回单个构成活动



我有一个正常的活动,我们称其为a,这是打开应用程序时向用户介绍的第一个活动。活动A具有启动活动的按钮,我们将其称为B,将launchMode设置为清单中的singleInstance。活动B进行一些处理。

用户可以按下"主页"按钮并再次打开应用程序,这将向它们提供启动活动,也就是Activity A.情况,活动B不会重新启动,即不会调用onCreate,因为它是singleInstance,这是我想要的。

我想让用户更容易在按下主页按钮时启动后,进行活动B。因此,我创建了一个持续的通知,使用户可以将活动B带回去。活动B完成后,正在进行的通知将被取消。

现在解决问题,单击正在进行的通知再次重新创建活动B,即再次调用onCreate。我不知道为什么这里的行为与单击活动A上的按钮不同。这是我创建通知的方式:

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应具有singleTasksingleInstance的启动模式,您应该设置android:taskAffinity="call"或类似的内容。为了不使用户混淆,您还应该为CallActivity提供不同的android:label和其他android:icon,以便当此任务出现在最近的任务列表中时,它看起来与应用程序的其余部分不同。确保启动CallActivity时,还会设置FLAG_ACTIVITY_NEW_TASK。构建Notification时,还应设置此标志。

您需要在创建PendingIntent对象之前将FLAG_ACTIVITY_SINGLE_TOP设置为Intent实例(在您的情况下notifyIntent)。

换句话说:

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());

相关内容

  • 没有找到相关文章

最新更新