如何在android中等待firebase pushtoken
我正在使用firebase通知。有时我不能按时拿到pushtoken。我怎么能等呢如何在android中等待firebase pushtoken,android,firebase,push-notification,firebase-cloud-messaging,Android,Firebase,Push Notification,Firebase Cloud Messaging,我正在使用firebase通知。有时我不能按时拿到pushtoken。我怎么能等呢 pushToken = firebaseIDService.getToken(); //SOME CODE registerUser(pushToken); 所以,我只想停止该函数,直到得到getToken()的结果 谢谢。令牌是异步生成的,可以定期刷新。要确保您的应用程序使用最新的令牌,请按照以下文档中所示实施FirebaseInstanceService.onTokenRefresh: 每当生成新令牌时,o
pushToken = firebaseIDService.getToken();
//SOME CODE
registerUser(pushToken);
所以,我只想停止该函数,直到得到getToken()的结果
谢谢。令牌是异步生成的,可以定期刷新。要确保您的应用程序使用最新的令牌,请按照以下文档中所示实施
FirebaseInstanceService.onTokenRefresh
:
每当生成新令牌时,onTokenRefreshcallback
就会触发,因此在其上下文中调用getToken
可以确保您正在访问当前可用的注册令牌。确保已将服务添加到清单中,然后在onTokenRefresh
的上下文中调用getToken
,并记录值,如图所示:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(refreshedToken);
}
上面代码段中的
sendRegistrationToServer
函数是您自己实现的,因此很可能相当于代码中的registerUser
警告!不要在主线程上使用它!
而且,这是一种不好的做法(可能),最好使用@FrankvanPuffelen的答案。
我不确定它是否有效,但我对一些异步操作使用相同的方法
@WorkerThread
public String getTokeSync(Context context) {
String token = FirebaseInstanceId.getInstance().getToken();
if (token != null)
return token;
IntentFilter filter = new IntentFilter();
filter.addAction("com.google.android.c2dm.intent.RECEIVE");
filter.addCategory(BuildConfig.APPLICATION_ID);
final CountDownLatch lock = new CountDownLatch(1);
final FirebaseInstanceIdReceiver br = new FirebaseInstanceIdReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
token = FirebaseInstanceId.getInstance().getToken();
lock.countDown();
context.unregisterReceiver(this);
}
}
context.registerReceiver(br, filter);
lock.await(); // Better use await with timeout
return token;
}
您没有按时获得令牌是什么意思?因为这是一个异步任务,getToken start但函数的其余部分继续。因此,在getToken返回任何内容之前调用registerUser()。那么,将register user放入异步任务的onPostExecute中如何使用回调实现它呢?
onTokenRefresh
是回调是的,我理解,但我无法从该方法访问另一个类(其中我有registerUser)。在这个类中,我可以创建一个firebaseIDService实例(这就是我正在做的)来调用getToken。我怎么能叫另一个班?很抱歉,我在这方面有点慢。即使没有打开任何活动,您的FirebaseInstancedService
子类也会在后台运行,因此它的生命周期可能与以前不同。您必须将registerUser()
方法移动到一个可以从onTokenRefresh()
调用它的位置。