[英]Android Notification Intent Not launching the said Activity and Notification Sound Issue
Hi i am working on an app that uses Firebase Cloud Messaging and i am trying to show notification when app receives a message using Firebase Cloud Messaging. 嗨,我正在使用Firebase Cloud Messaging的应用程序上工作,并且我尝试在应用程序使用Firebase Cloud Messaging接收消息时显示通知。
When App is Running 当应用程序运行时
Now when App is closed not running in background (these are the main issues that need to be resolved and need explanation for this unnatural behaviour) 现在,当关闭App时,它不会在后台运行(这些主要问题需要解决,并且需要针对这种不自然的行为进行解释)
Below are the Code Snippets. 以下是代码片段。
Mainfest.xml Mainfest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".Splash"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".LoginActivity"
android:label="@string/title_activity_login"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".SignupActivity"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".Dashboard"
android:label="@string/title_activity_dashboard" />
<activity android:name="pk.edu.kiu.jobslocatoer.NotificationActivity"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
<intent-filter>
<action android:name="pk.edu.kiu.jobslocatoer.MESSAGING_ACTIVTY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name=".receivers.NotificationReceiver">
<intent-filter>
<action android:name="pk.edu.kiu.jobslocatoer.MESSAGING_EVENT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name=".SettingsActivity"></activity>
<service android:name=".services.MessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".services.InstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
</application>
NotificationReceiver.java NotificationReceiver.java
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent notify = new Intent(context, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, (int) SystemClock.currentThreadTimeMillis(), notify, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(context)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Titile")
.setContentText("Text")
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notificationManager.notify((int) SystemClock.currentThreadTimeMillis(), notification);
}
}
MessagingService.java MessagingService.java
public class MessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(GlobalConfig.TAG, GlobalConfig.getRef(this) + " notificaiton: " + remoteMessage.getNotification().getBody());
sendBroadcast(new Intent("pk.edu.kiu.jobslocatoer.MESSAGING_EVENT"));
}
}
Use this code:
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
if (bitmaplogo != null) {
notificationBuilder.setLargeIcon(bitmaplogo);
} else {
notificationBuilder.setLargeIcon(largeIcon);
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notificationBuilder.setSmallIcon(R.drawable.app_icon_transparent);
} else {
notificationBuilder.setSmallIcon(R.mipmap.app_icon);
}
notificationBuilder.setColor(getResources().getColor(R.color.colorAccent));
notificationBuilder.setContentTitle(getResources().getString(R.string.app_name));
notificationBuilder.setContentText(messageBody);
notificationBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody));
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
notificationBuilder.setContentIntent(pendingIntent);
int num = (int) System.currentTimeMillis();
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(num, notificationBuilder.build());
Intent resultIntent = null;
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(context.getString(R.string.app_name))
.setAutoCancel(true)
.setContentText(message);
resultIntent = new Intent(context,Activity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(Activity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
5,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(pushId, mBuilder.build());
Try this: 尝试这个:
Intent intent = new Intent(this, NotificationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_name)
.setContentTitle("Title")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
Firebase Notification Firebase通知
1.If you are sending notification through firebase console,firebase will add a notification object to your message like this 1.如果您是通过Firebase控制台发送通知,firebase会像这样向您的消息中添加一个通知对象
{
//..
"notification" : {
"body" : "message body sample text",
"title" : "notification Tittle",
"icon" : "icon information sample"
}
//..
}
1) If your notification contains this notification payload and If your app is in background then, 1)如果您的通知包含此通知有效负载,并且如果您的应用程序处于后台 ,
2) If your notification contains this notification payload + data payload and If your app is in background then, 2)如果您的通知包含此通知有效负载 + 数据有效负载,并且如果您的应用程序处于后台 ,
3) If your notification contains only data payload ( {data" : {"body" : "message body sample text","title" : "notification Tittle","icon" : "icon information sample"}
) and If your app is in background or foreground then, 3)如果您的通知仅包含数据有效载荷 ( {data" : {"body" : "message body sample text","title" : "notification Tittle","icon" : "icon information sample"}
),并且您的应用程序然后在背景或前景中
So If you want to execute OnMessageReceived()
method everytime when you get a notification,then from server side you should always pass only data payload .Otherwise OnMessageReceived()
will not be executed and Firebase will handle the notification showing thing. 因此,如果您想在每次收到通知时都执行OnMessageReceived()
方法,则应始终从服务器端传递仅数据有效负载。否则, OnMessageReceived()
将不会执行,Firebase将处理显示事物的通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.