使用 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 应用程序

使用 Firebase 的聊天应用程序:收到新消息时获取通知 - Android

android firebase通知不起作用

适用于 Android 的 Firebase 推送通知