当app在前台时,不会调用onMessageReceived()

时间:2016-09-22 13:53:54

标签: android firebase

我正在使用以下代码来接收通过firebase控制台发送的fcm消息,但是这个功能永远不会被调用。相反,当应用程序处于后台时,我能够在我的启动器类中接收消息,但是当应用程序处于前台时,我无法获得它。

<span id="thisspan" class="whateverclass">1500</span>
<div id="thevalueis"></div>
<script>
   document.getElementById("thevalueis").innerHTML=document.getElementById("thisspan").innerHTML;
</script> 

清单

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";
String message="";
Map<String, String> m1;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    //Displaying data in log
    //It is optional
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
    System.out.println("---------------------");

    message = remoteMessage.getNotification().getTitle();
    m1= remoteMessage.getData();
    System.out.println("=============="+m1);
    System.out.println("=============="+m1.get("url"));

    //Calling method to generate notification
    //sendNotification(remoteMessage.getNotification().getBody());
    //sendNotification_test(message);
   createNotification(m1,remoteMessage.getNotification().getBody());
}


private void createNotification(Map<String,String> payload, String title){

    Intent intent = new Intent(this, LoginActivity.class);


    intent.putExtra("url",payload.get("url"));
    intent.putExtra("package",payload.get("package"));
    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.mipmap.ic_launcher)
            .setContentTitle("FCM Message")
            .setContentText(title)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}

2 个答案:

答案 0 :(得分:4)

我将服务声明放在清单中的应用程序标记之外:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name="com.example.pranshusrivastav.fcmtest.MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <service
            android:name="com.example.pranshusrivastav.fcmtest.MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
    </application>

这有效!!

答案 1 :(得分:0)

试试这个'

    * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // There are two types of messages data messages and notification messages. Data messages are handled
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
    // is in the foreground. When the app is in the background an automatically generated notification is displayed.
    // When the user taps on the notification they are returned to the app. Messages containing both notification
    // and data payloads are treated as notification messages. The Firebase console always sends notification
    // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
    //
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    //The message which i send will have keys named [message, image, AnotherActivity] and corresponding values.
    //You can change as per the requirement.

    //message will contain the Push Message
    String message = remoteMessage.getData().get("message");
    //imageUri will contain URL of the image to be displayed with Notification
    String imageUri = remoteMessage.getData().get("image");
    //If the key AnotherActivity has  value as True then when the user taps on notification, in the app AnotherActivity will be opened. 
    //If the key AnotherActivity has  value as False then when the user taps on notification, in the app MainActivity will be opened. 
    String TrueOrFlase = remoteMessage.getData().get("AnotherActivity");

    //To get a Bitmap image from the URL received
    bitmap = getBitmapfromUrl(imageUri);

    sendNotification(message, bitmap, TrueOrFlase);

}

使用Firebase控制台发送时,如果应用程序位于前台,则将调用onMessageReceived()方法。因此,向用户显示从URL获取的具有图像的通知。但如果应用程序是后台或已杀死状态,则不会调用onMessageReceived()方法。因此,只有一条消息的简单通知将显示在Android设备的通知栏中。

你必须使用

https://fcm.googleapis.com/fcm/send

内容类型:应用/ JSON 授权:键= AIza ************ adrTY

{“data”:{     “image”:“https://ibin.co/2t1lLdpfS06F.png”,     “message”:“使用API​​的Firebase推送消息”     “AnotherActivity”:“真实”   },   “to”:“f25gYF3 *********************** HLI” }

使用Messaging API:要使用API​​发送消息,您可以使用名为AdvancedREST Client的工具,它是chrome扩展,并发送包含以下参数的消息。