通知服务

时间:2018-07-01 13:48:52

标签: android firebase firebase-cloud-messaging

我正在尝试使用Firebase接收Android通知。我定义了以下服务。但是服务MyFirebaseInstanceIDService首次运行时正在运行该应用程序。那时我什至没有用户数据库。我想为用户存储firebase令牌,但首先我要在第一个活动中为用户创建一个条目,并在第二个活动中启动服务。这样我就可以存储用户的令牌。

Android清单文件

<service
    android:name="in.anamika.anamika.notifications.MyFirebaseMessagingService"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>
<service android:name="in.anamika.anamika.notifications.MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

3 个答案:

答案 0 :(得分:5)

根据我对您问题的理解,我看到了不止一种解决方案,如下所示:

  1. 最初,您可以将令牌保存为共享首选项,如Nainal所述 然后,当用户成功登录并创建数据库后,您可以将其存储到表中。

更新后的API返回任务,您可以在其上添加onSuccess侦听器,并在成功获取令牌后将调用它。

    FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(yourActivity,  
    new OnSuccessListener<InstanceIdResult>() {                    
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {
                      String deviceToken = instanceIdResult.getToken();
                      // Do whatever you want with your token now
                      // i.e. store it on SharedPreferences or DB
                      // or directly send it to server 
                }
});
  1. 这会很长,但是您可以从 onTokenRefresh() onNewToken()发送自己的自定义广播,将回调接口设置为从活动接收到广播接收器并获取通过覆盖回调方法在Activity中进行调用。

请注意:不建议使用 FirebaseInstanceIdService ,我们可以重写onNewToken()以仅在FirebaseMessagingService中获取新的/更新的令牌。
您可以检查this链接。

答案 1 :(得分:3)

将此代码放入启动器/主要活动中:

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

与进入Web下面的页面相比,这将为您提供令牌-

https://console.firebase.google.com/project/_/notificationcreate new notification->choose single device->paste在Android Studio项目中记录的令牌->检查是否收到通知

答案 2 :(得分:0)

注意:解决方案基于FirebaseInstanceIdService和FirebaseMessagingService类。但它将与Firebase Android SDK的较新更新一起使用

以下是解决您的问题的方案:

  1. 在令牌刷新的回调中,首先检查FirebaseUser是否 存在身份验证。如果存在,只需将令牌写入您的 Firebase数据库。同时将布尔值存储到“共享首选项”中 如果令牌保存在数据库中,则为true,否则将其设置为false。这解决了 问题是您没有数据库访问权限,但正在获取令牌。

  2. 接下来在单独的类中创建一个异步任务,只需调用     FirebaseInstanceId.getInstance().getToken();触发     onTokenRefresh投入使用。

  3. firebase身份验证成功后,登录过程中的下一步将调用     异步任务之上,这将强制onTokenRefresh回调。现在     由于存在用户身份验证,因此您对数据库的写入将成功(也     设置共享的首选项 token_sent_to_db = true)。

  4. 现在在您正在检查用户身份验证的启动活动中     导航到适当的活动,添加检查共享的首选项      token_sent_to_db = false;再次调用异步任务。这将确保,如果上述步骤中的某些步骤错过了将令牌保存到db中,我们可以     再次发送令牌。

  5. 最后,直到您强制将FCM的令牌更改为     更改或卸载应用程序。所以令牌只会得到     只能写入一次db。

P.S:还请确保在用户注销后,您使FCM令牌到期,否则服务器将继续向已注销的用户发送通知。 FirebaseInstanceId.getInstance()。deleteInstanceId();