Search code examples
androidfirebaseandroid-servicefirebase-cloud-messagingandroid-broadcastreceiver

Data are not shown in BroadcastReceiver using Android


I want to use Firebase in my application and show the token when calling the service and Broadcast! I write the below codes, but it didn't show any more in the textview!

MyFCMInstance :

public class MyFCMInstance extends FirebaseInstanceIdService {

    public static final String TOKEN_BROADCAST = "fcmtokenbroadcast";

    @Override
    public void onCreate() {
        super.onCreate();
        String CurrentToken = FirebaseInstanceId.getInstance().getToken();
        if (CurrentToken != null) {
            Intent intent = new Intent("Token");
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            Log.d("token", "Refreshed token: " + CurrentToken);
            storeToken(CurrentToken);
            getApplicationContext().sendBroadcast(new Intent(TOKEN_BROADCAST));

        } else {
            onTokenRefresh();
        }
    }

    @Override
    public void onTokenRefresh() {

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.e("FCM Instance", "Token : " + refreshedToken);

        // store token
        storeToken(refreshedToken);

        // send broadcast
        getApplicationContext().sendBroadcast(new Intent(TOKEN_BROADCAST));
    }

    private void storeToken(String token) {
        SharedPrefsManager.getInstance(getApplicationContext()).storeToken(token);
    }
}

SharedPrefsManager codes:

public class SharedPrefsManager {

    private static final String SHARED_PREF_NAME = "FCMPrefs";
    private static final String KEY_ACCESS_TOKEN = "Token";
    private static Context mContext;
    private static SharedPrefsManager mInstance;

    public SharedPrefsManager(Context context) {
        mContext = context;
    }

    public static synchronized SharedPrefsManager getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new SharedPrefsManager(context);
        }
        return mInstance;
    }

    public boolean storeToken(String token) {
        SharedPreferences preferences = mContext.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(KEY_ACCESS_TOKEN, token);
        editor.apply();

        return true;
    }

    public String getToken() {
        SharedPreferences preferences = mContext.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
        String token = preferences.getString(KEY_ACCESS_TOKEN, null);

        return token;
    }
}

MainActivity codes:

public class MainActivity extends AppCompatActivity {

    private TextView tokenTV;
    private BroadcastReceiver broadcastReceiver;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tokenTV = (TextView) findViewById(R.id.tokenText);
        context = MainActivity.this;
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                tokenTV.setText(SharedPrefsManager.getInstance(context).getToken());
            }
        };
        registerReceiver(broadcastReceiver, new IntentFilter(MyFCMInstance.TOKEN_BROADCAST));
    }
}

How can I fix it and show the token in TextView ?


Solution

  • onTokenRefresh() method is only called once after you install your application. SO in your code it will only show token once and that too only first time. Override onCreate() method in your fcm service class and do something like this

     @Override
        public void onCreate() {
            super.onCreate();
            String CurrentToken = FirebaseInstanceId.getInstance().getToken();
            if (CurrentToken!=null){
                Intent intent = new Intent("device_id");
                LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
                Log.d("token", "Refreshed token: " + CurrentToken);
                appSharedPreferences.putString("device_id",CurrentToken);
                getApplicationContext().sendBroadcast(new Intent(TOKEN_BROADCAST));
    
            }
            else {
              onTokenRefresh();
    
    
                       }
    }