使用 Firebase 和 Android 的通知
Posted
技术标签:
【中文标题】使用 Firebase 和 Android 的通知【英文标题】:Notification using Firebase and Android 【发布时间】:2018-08-13 14:28:00 【问题描述】:我正在尝试制作一个我使用 firebase 接收通知的 android 应用程序。我关注了互联网上可用的资源。
我要做的就是从 firebase 发送通知,我收到的消息我想在主要活动的 TextView 中显示它。
目前我正在模拟器中进行测试。有几个问题我无法解决。
我可以从 firebase 发送通知,但是:
-
当应用程序在前台运行时,我在 android 通知面板中没有收到通知,主 Activity 中也没有任何反应。也就是TextView中的文字没有变化。
当应用程序在后台运行时,我确实在 android 通知面板中收到通知,其中包含从 firebase 发送的消息,单击通知主活动会打开,但 TextView 中的文本不会更改。
Firebase 消息服务
public class VAFirebaseMessagingService extends FirebaseMessagingService
private static final String TAG = "VAFirebaseMessagingS";
public VAFirebaseMessagingService()
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
super.onMessageReceived(remoteMessage);
Log.d(TAG, "From: " + remoteMessage.getFrom());
if(remoteMessage.getData().size() > 0)
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
sendNotification(remoteMessage.getData().get("text"));
if(remoteMessage.getNotification() != null)
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody());
private void sendNotification(String messageBody)
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(Intent.EXTRA_TEXT, messageBody);
PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(R.drawable.ic_stat_name);
notificationBuilder.setContentTitle("PFIVA");
notificationBuilder.setContentText(messageBody);
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
notificationBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
主要活动
public class MainActivity extends AppCompatActivity
private TextView userFeedbackQuery;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userFeedbackQuery = (TextView) findViewById(R.id.pfiva_user_feedback_query);
final Intent intent = getIntent();
if(intent.hasExtra(Intent.EXTRA_TEXT))
String userFeedbackQueryText = intent.getStringExtra(Intent.EXTRA_TEXT);
userFeedbackQuery.setText(userFeedbackQueryText);
Android 清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.pfiva.mobile.voiceassistant">
<uses-permission android:name="android.permission.INTERNET" />
<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=".activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".messaging.FirebaseInstanceService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".messaging.VAFirebaseMessagingService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
</manifest>
请有人指导这里有什么问题吗?我该如何解决以上两个问题。
谢谢
根据建议我在消息服务中进行了以下更改,基本上添加了通知渠道。
private void sendNotification(String messageBody)
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(Intent.EXTRA_TEXT, messageBody);
PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID);
notificationBuilder.setSmallIcon(R.drawable.ic_stat_name);
notificationBuilder.setContentTitle("PFIVA");
notificationBuilder.setContentText(messageBody);
notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH);
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
notificationBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance);
notificationManager.createNotificationChannel(channel);
notificationManager.notify(0, notificationBuilder.build());
我现在面临的问题是,当应用程序在后台运行时,我确实在通知面板中收到通知并单击它打开主要活动,但 TextView 中的文本没有更新。
【问题讨论】:
请编辑问题以准确描述您发送通知的方式。 【参考方案1】:解决您的问题的两个想法:
您是否在 AndroidManifest.xml 中注册了您的 VAFirebaseMessagingService
:
从 Android 8 开始,您必须使用通知通道来发送推送通知。 Android
【讨论】:
是的,我现在还附加了 android manifest。寻找通知渠道的变化 现在在您的模拟器上检查您的 android 版本;)当您的设备版本为 8.0 或更高版本时,您无法使用上面的代码接收通知。 添加通知通道后,一切开始工作,但当应用程序在后台运行时出现问题。现在,当应用程序在前台和后台运行时,我都会收到通知。当应用在前台运行时,TextView 中的文本也会更新。但是当应用程序在后台运行时,点击通知面板中的通知后,应用程序进入前台,但 TextView 中的文本并没有改变。请你能建议。我在上面更新了我的机会。 问题是,后台任务无法向不存在的活动发送意图。所以我认为一个好方法是将文本保存在 SharedPreferences 或 SQLite 数据库中,然后在 MainActivity 的 onCreate 方法中检索文本。以上是关于使用 Firebase 和 Android 的通知的主要内容,如果未能解决你的问题,请参考以下文章
使用 firebase_messaging 自定义通知(Android 和 IOS)
Android 中的 Firebase 通知 (Kotlin)
使用 PhoneGap 和 Firebase 云消息传递 (FCM) 的简单推送通知 Android 应用程序