点击打开登录活动而不是主要活动的通知
Posted
技术标签:
【中文标题】点击打开登录活动而不是主要活动的通知【英文标题】:Notification on click opening login activity instead of main activity 【发布时间】:2019-03-08 17:10:48 【问题描述】:我的应用中有基于 Firebase 的通知。从服务器收到消息后,我可以在手机中看到通知。但是当我点击通知中的消息时,它总是打开我的启动画面,然后是 LoginActivity 而不是 MainActivity。我想打开 MainActivity 并显示消息详细信息,为此我使用“putExtra”将通知的消息正文传递给 MainActivity。
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getTitle().toString(), remoteMessage.getNotification().getBody());
//This method is only generating push notification
private void sendNotification(String messageTitle, String messageBody)
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Title", messageTitle);
intent.putExtra("data", messageBody);
intent.putExtra("KEY", "Notify");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
numNotifications = numNotifications + 1;
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
inboxStyle.setBigContentTitle(getString(R.string.app_notification)) ;
inboxStyle.setSummaryText(getString(R.string.app_count_notifications1)
+ numNotifications + getString(R.string.app_count_notifications2));
inboxStyle.bigText(messageBody);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.q_me_notify)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setStyle(inboxStyle)
.setGroup(TAG)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
try
notificationManager.notify(TAG, APPID, notificationBuilder.build());
catch (Exception e)
e.printStackTrace();
我的 android 清单文件如下所示:
<application
android:allowBackup="true"
android:icon="@drawable/final"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".LoginActivity"
android:theme="@style/LoginTheme"
android:launchMode="singleTask"/>
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme"
android:launchMode="singleTask"/>
<!-- Defining Services -->
<service android:name=".services.FirebaseMessageService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".services.FirebaseInstanceService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
这发生在我的带有 Android 7.0 的 Samsung On8 (J7 Pro) 中 - 无论应用程序是在前台还是后台(它总是打开 LoginActivity)。但是在我的 Nexus 5 有 Android 5.1.1 时,只有当应用程序处于后台/终止时才会出现这种行为,而当应用程序处于前台时它可以正常工作。
所以,我的问题是:
无论型号和操作系统版本如何,如何让应用在前台显示 MainActivity,以便正确显示通知消息详细信息?
当应用程序处于后台/终止状态时,如何跨(Splash --> LoginActivity --> MainActivity)传递通知值,以便在 MainActivity 中正确显示消息?
【问题讨论】:
【参考方案1】:添加TaskStackBuilder
,替换:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
用这个:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
编辑:显然在您的MainActivity
中,您应该有逻辑从Intent
检索数据并更新Activity
【讨论】:
【参考方案2】:在浏览了几篇文章和博客后,我解决了这个问题。对我有很大帮助的最好的和详细的答案是 Mukesh Rana 在这篇文章中的回答 Clicking on notification doesn't open mentioned activity
我现在使用 REST api 从服务器发送“数据”有效负载,无论应用程序是在前台还是后台,它总是被拾取。如果应用程序处于后台,通知的 onClick 始终会启动启动画面(启动器)。在 onMessageReceived 中,我使用 remoteMessage.getData() 获取“数据”。在意图中,我使用 intent.putExtra(key, value) 将值传递给意图(后台应用程序默认为启动画面)。从那里我将它传递给 MainActivity 并使用 getStringExtra(key) 获取值。
【讨论】:
以上是关于点击打开登录活动而不是主要活动的通知的主要内容,如果未能解决你的问题,请参考以下文章
FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动