简体   繁体   English

为什么从不调用FirebaseInstanceIdService.onTokenRefresh()?

[英]Why is FirebaseInstanceIdService.onTokenRefresh() is never called?

Maybe I am doing a wrong step. 也许我做错了一步。 I have 3 activities: 我有3个活动:

  • Launcher 发射器
  • Login 登录
  • MainActivity 主要活动

In the onCreate of my MainActivity, I am calling the service: 在我的MainActivity的onCreate中,我正在调用该服务:

   void iniciarServicioSendTokenFCM(){

        servicioFCM= new Intent(this, IDService.class);
        startService(servicioFCM);

    }

And this is executed, because it gets to enter in onCreate of Service but onTokenRefresh() is never executed. 并执行此操作,因为它可以输入Service的onCreate ,但从不执行onTokenRefresh()

I have done these steps too. 我也做了这些步骤 I have uninstalled and reinstalled the app but it didn't work. 我已经卸载并重新安装了该应用程序,但没有成功。

public class IDService extends FirebaseInstanceIdService {

    private ConnectionStatusSync ConnSync;//= new ConnectionStatusSync(this);
    private DispositivoSync Sync;
    private Integer dispositivoId;
    private PreferenceUtil preferenceUtil ;
    private String tokenDispositivo;
    private DispositivoSync.OnFragmentInteractionListener listener;
    public IDService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        Listener();
        ConnSync = new ConnectionStatusSync(this);
        Sync = new DispositivoSync(this);
        preferenceUtil= new PreferenceUtil(this);

        dispositivoId=preferenceUtil.getInt(getString(R.string.dispositivoID),0,null);
        dispositivoId=(dispositivoId==0?null:dispositivoId);
        tokenDispositivo= new IDUtil(this).getId();


    }

    private  void Listener(){
        listener = new DispositivoSync.OnFragmentInteractionListener() {
            @Override
            public void onFinished(boolean terminoBien, int dispositivoID) {
                if(terminoBien){
                    preferenceUtil.savePreference(getString(R.string.dispositivoID),dispositivoID,null);

                }
            }
        };
    }

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        preferenceUtil.savePreference(getString(R.string.TokenFCM),refreshedToken,null);
        //Log.d(TAG, "Refreshed token: " + refreshedToken);

        // TODO: Implement this method to send any registration to your app's servers.
        if(validaciones())
        sendRegistrationToServer(refreshedToken);
    }

    private  boolean validaciones(){

        return  dispositivoId!=null && MainActivity.mOperador!=null;
    }

    private  void sendRegistrationToServer(final String token){



        final Thread registrar = new Thread(new Runnable() {
            @Override
            public void run() {
Sync.EnviarDispositivo(MainActivity.mOperador.getOperadorIdServidor(),dispositivoId,token,tokenDispositivo,listener );
            }
        });

        Thread hilo  = new Thread(new Runnable() {
            @Override
            public void run() {

                Command commandNull= new Command() {
                    @Override
                    public void execute() {

                    }
                };

               ConnSync.CheckConnection(registrar,commandNull);

            }
        });

        hilo.start();

    }



}

In an app that uses Firebase Cloud Messaging, the client immediately starts generating the token when the app starts. 在使用Firebase Cloud Messaging的应用程序中,客户端会在应用程序启动时立即开始生成令牌。

Most likely the initial token has already been generated by the time you start listening for onTokenRefresh() . 当您开始监听onTokenRefresh()时,很可能已经生成了初始令牌。 So you'll want to also immediately request and store the token in your iniciarServicioSendTokenFCM method: 因此,您还需要立即请求令牌并将其存储在iniciarServicioSendTokenFCM方法中:

sendRegistrationToServer(FirebaseInstanceId.getInstance().getToken());

I don't think it is very useful to store the token in shared preferences by the way, given that it is readily accessible from FirebaseInstanceId.getInstance().getToken() . 鉴于可以从FirebaseInstanceId.getInstance().getToken()轻松访问令牌,因此我认为将令牌存储在共享首选项中不是很有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM