如何修复当应用 运行 时通知不显示的问题?
How to fix notification not showing up when app is running?
我制作了一个实施了 Firebase 的测试应用程序,我正在使用 Firebase 的通知编辑器,它工作正常但不符合预期,因为通知仅在应用程序未处于活动状态时显示(在屏幕上)我需要它显示,即使应用程序处于活动状态并且 运行
MainActivity.java
package com.gci.gestioncapteursincendie;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.TextView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= findViewById(R.id.textViewToken);
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if(task.isSuccessful()){
String token = task.getResult().getToken();
System.out.println("token:"+token);
textView.setText("Token : " + token);
}
else
{
textView.setText("Token Not Generated");
}
}
});
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gci.gestioncapteursincendie">
<!-- Granting Internet access permission to app -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.gci.gestioncapteursincendie.FirebaseActivity"
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">
<service
android:name=".FirebaseMessagingServiceExtended"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
编辑:添加清单
当应用程序关闭时,您的通知将由 Google 服务进程处理,该进程负责根据需要显示您的通知,包括默认点击操作(打开应用程序)和通知图标。
当应用程序在前台时,接收到的消息由应用程序处理,因为没有逻辑来处理它,所以什么也不会发生!
您可以创建自定义 FirebaseMessagingService
来实现 onMessageReceived
,然后在其中创建通知..
public class NotificationService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody())
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
manager.notify(some_int_number (eg : 123), notification);
}
}
并将其添加到您的清单文件
<service android:name=”.NotificationService”>
<intent-filter>
<action android:name=”com.google.firebase.MESSAGING_EVENT”/>
</intent-filter>
</service>
还要确保您在清单文件中授予了适当的权限。
实施重试后,您应该会在应用处于前台时看到通知。
您必须在发送给 SDK 的对象中将 show_in_foreground 设置为 Ture。
const objNotification = {
title: ‘xxxxxx’,
body: ‘xxxxx’,
sound: 'default',
priority: 'high',
show_in_foreground: true,
};
const myMessage = JSON.stringify(objNotification);
let message;
message = {
notification: {
title: ‘xxxxxx’,
body: `xxxxx`,
},
data: {
custom_notification: myMessage,
},
token: registrationToken,
};
admin.messaging().send(message)
.then((response) => {
res.status(200).send({ success: true, result: response, });
})
.catch((error) => {
console.log('Error sending message:', error);
res.status(400).send({ success: false, result: error });
});
我制作了一个实施了 Firebase 的测试应用程序,我正在使用 Firebase 的通知编辑器,它工作正常但不符合预期,因为通知仅在应用程序未处于活动状态时显示(在屏幕上)我需要它显示,即使应用程序处于活动状态并且 运行
MainActivity.java
package com.gci.gestioncapteursincendie;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.TextView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= findViewById(R.id.textViewToken);
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if(task.isSuccessful()){
String token = task.getResult().getToken();
System.out.println("token:"+token);
textView.setText("Token : " + token);
}
else
{
textView.setText("Token Not Generated");
}
}
});
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gci.gestioncapteursincendie">
<!-- Granting Internet access permission to app -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.gci.gestioncapteursincendie.FirebaseActivity"
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">
<service
android:name=".FirebaseMessagingServiceExtended"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
编辑:添加清单
当应用程序关闭时,您的通知将由 Google 服务进程处理,该进程负责根据需要显示您的通知,包括默认点击操作(打开应用程序)和通知图标。
当应用程序在前台时,接收到的消息由应用程序处理,因为没有逻辑来处理它,所以什么也不会发生!
您可以创建自定义 FirebaseMessagingService
来实现 onMessageReceived
,然后在其中创建通知..
public class NotificationService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody())
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
manager.notify(some_int_number (eg : 123), notification);
}
}
并将其添加到您的清单文件
<service android:name=”.NotificationService”>
<intent-filter>
<action android:name=”com.google.firebase.MESSAGING_EVENT”/>
</intent-filter>
</service>
还要确保您在清单文件中授予了适当的权限。 实施重试后,您应该会在应用处于前台时看到通知。
您必须在发送给 SDK 的对象中将 show_in_foreground 设置为 Ture。
const objNotification = {
title: ‘xxxxxx’,
body: ‘xxxxx’,
sound: 'default',
priority: 'high',
show_in_foreground: true,
};
const myMessage = JSON.stringify(objNotification);
let message;
message = {
notification: {
title: ‘xxxxxx’,
body: `xxxxx`,
},
data: {
custom_notification: myMessage,
},
token: registrationToken,
};
admin.messaging().send(message)
.then((response) => {
res.status(200).send({ success: true, result: response, });
})
.catch((error) => {
console.log('Error sending message:', error);
res.status(400).send({ success: false, result: error });
});