如何修复在应用程序运行时不显示通知的问题?

时间:2019-04-01 00:25:15

标签: android firebase firebase-notifications

我制作了一个已实现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>

编辑:添加清单

2 个答案:

答案 0 :(得分:2)

关闭应用程序后,您的通知将由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>

还要确保您在清单文件中给予适当的权限。 实施完重试后,您应该在应用程序处于前台状态时看到通知。

答案 1 :(得分:0)

必须在要发送到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 });
                      });