Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 登录活动后FirebaseMessagingService如何启动_Java_Android_Firebase_Firebase Cloud Messaging - Fatal编程技术网

Java 登录活动后FirebaseMessagingService如何启动

Java 登录活动后FirebaseMessagingService如何启动,java,android,firebase,firebase-cloud-messaging,Java,Android,Firebase,Firebase Cloud Messaging,是否可以在某些活动后启动FirebaseMessagingService?因为当我的应用程序启动时,FirebaseMessagingService调用onNewToken(字符串令牌)->sendRegistrationToServer(令牌),但我只需要在用户登录后发送令牌,这样我就可以映射用户和令牌。最好的选择是,FirebaseMessagingService跳过登录和注册活动,然后启动。但我不确定这是否可以做到?如何操作?如果您有其他活动,只需将发送注册到服务器(令牌)移动到下一个活动

是否可以在某些活动后启动FirebaseMessagingService?因为当我的应用程序启动时,
FirebaseMessagingService
调用
onNewToken(字符串令牌)->sendRegistrationToServer(令牌)
,但我只需要在用户登录后发送令牌,这样我就可以映射用户和令牌。最好的选择是,FirebaseMessagingService跳过登录和注册活动,然后启动。但我不确定这是否可以做到?如何操作?

如果您有其他活动,只需将
发送注册到服务器(令牌)
移动到下一个活动。通过
Intent
传递值,然后发送

编辑:下面是按需生成令牌(KOTLIN)的示例代码

您可以忽略
sendRegistrationToServer
。我不用它。如您所见,我将令牌保存在SharedReferences中。成功登录后,检索它(可以在下一个活动中),然后将其发送到服务器


相关链接供您阅读:

让FirebaseMessagingService在应用程序启动时按预期运行。调用onNewToken时,将令牌保存到首选项中


登录后,从首选项获取本地令牌并发送到您的服务器。

您可以使用类似于isLogin的标志处理并签入您的onNewToken()。即使您正在上传到服务器,您也需要在要添加令牌的用户中输入用户id。。但是,当您未登录时,您没有用户id,因此在这种情况下,您还可以检查用户id是否不为null或不为空。当您获得用户id时,您可以使用下面的kotlin方法向服务器添加令牌

fun getFirebaseDeviceToken(context: Context?) {
            FirebaseInstanceId.getInstance().instanceId
                    .addOnCompleteListener(OnCompleteListener { task ->
                        if (!task.isSuccessful) {
                            return@OnCompleteListener
                        }
                        if (task.result != null) {
                            val token = task.result!!.token
                            if (context != null) {
                                uploadUserDeviceInfo(context, token)
                            }
                        }
                    })
        }

这是不可能的,因为FirebaseMessagingService在应用程序启动时独立调用这些方法,或者我不理解我对SharedReferences的一些想法,但是当令牌过期或用户清除数据时会发生什么?当用户清除应用程序数据时,您没有任何控制权。如果发生这种情况,用户可能必须再次重新登录,然后按需再次生成instanceId,再次将其发送到服务器以便更新。FirebaseMessagingService在启动应用程序后触发一次登录后方法onNewToken()不被调用。您可以使用answerI中提到的方法随时获取令牌,但令牌过期或用户清除数据时会发生什么情况当令牌过期onNewToken将根据首选项更新令牌。如果您在应用程序打开时有“自动登录”或“签入”请求,您可以使用它发送最新令牌。最简单的方法是将FCM_令牌作为头发送到您的请求中。这样,它总是保持更新。
fun getFirebaseDeviceToken(context: Context?) {
            FirebaseInstanceId.getInstance().instanceId
                    .addOnCompleteListener(OnCompleteListener { task ->
                        if (!task.isSuccessful) {
                            return@OnCompleteListener
                        }
                        if (task.result != null) {
                            val token = task.result!!.token
                            if (context != null) {
                                uploadUserDeviceInfo(context, token)
                            }
                        }
                    })
        }