将GCM迁移到FirebaseCM:onMessageReceived()未在前台调用

时间:2016-12-19 16:20:18

标签: android google-cloud-messaging firebase-cloud-messaging migrating

我正在尝试将Android客户端应用程序从Google Cloud Messaging迁移到Firebase云消息传递。我严格遵循official tutorial,但没有成功 - 当应用程序在前台时,不会调用onMessageReceived()方法。

所以这里是我触及的代码片段。

build.gradle(项目级别)

dependencies {
    //other stuff
    classpath 'com.google.gms:google-services:3.0.0'
}

build.gradle(应用级别)

apply plugin: 'com.google.gms.google-services' //this line in the bottom

dependencies {
    //other stuff here
    compile 'com.google.firebase:firebase-messaging:9.0.0'
}

的AndroidManifest.xml

<service android:name=".service.FirebaseService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

<service
  android:name=".service.MyInstanceIDListenerService"
  android:exported="false">
   <intent-filter>
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
   </intent-filter>
</service>

<service
     android:name=".service.RegistrationIntentService"
     android:exported="false" />

作为<application>代码的孩子。

MyInstanceIDListenerService.java

public class MyInstanceIDListenerService extends FirebaseInstanceIdService {

final String TAG = "Firebase instance id";

@Override
public void onTokenRefresh() {

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
    intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

FirebaseService.java

public class FirebaseService extends FirebaseMessagingService {


//OtherStuff

@Override
public void onMessageReceived(RemoteMessage message){
    String from = message.getFrom();
    Map data = message.getData();

    Log.d(TAG, "Message: " + from); //Never appears in logcat
    //other stuff
}
}

RegistrationIntentService

public class RegistrationIntentService extends IntentService {

private static final String TAG = "RegIntentService";

public RegistrationIntentService() {
    super(TAG);
}

@Override
protected void onHandleIntent(Intent intent) {
    try {
        synchronized (TAG) {
            String token = FirebaseInstanceId.getInstance().getToken();
            Log.i(TAG, "GCM Registration Token: " + token);//This works fine
            //and shows this line - 12-19 17:59:33.295 3146-5386/ru.bpc.mobilebank.bpc I/RegIntentService: GCM Registration Token: *some_token*

            sendRegistrationToServer(token);
        }
    } catch (Exception e) {
        Log.d(TAG, "Failed to complete token refresh", e);
    }
}

private void sendRegistrationToServer(String token) {
    Intent intent = new Intent(RegistrationIntentServiceEvent.TOKEN);
    intent.putExtra(RegistrationIntentServiceEvent.TOKEN, token);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

请告诉我,如果我做错了,为什么注册似乎正确完成,但即使应用程序位于前台,也不会调用onMessageReceived()方法。提前谢谢。

P.S。顺便提一下,在Firebase控制台中添加SHA-1密钥是必要的吗?也许这可能会导致问题?但Firebase表示此操作是可选的。

1 个答案:

答案 0 :(得分:1)

如果您使用FCM,那么您应该替换此

 <service android:name=".service.GcmService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

 <service android:name=".service.FirebaseService">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

您的服务未正确注册..