From notification to fragment when app is in the b

2019-06-14 10:11发布

I am building an app with fragments and I am using Firebase notifications. I want, when user click on notification, to send him to the Fragment1 on MainActivity. And, I've done it, but the problem is that works only when app is in the foreground. When app is in background notification sends me to the MainActivity not to the Fragment1. This is MyFirebaseMessagingService:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Log.d(TAG, "From " + remoteMessage.getFrom());
    Log.d(TAG, "Body " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage);
    Log.d("Msg", "Poruka je stigla");
}
private void sendNotification(RemoteMessage remoteMessage){
    Intent intent=new Intent(myFirebaseMessagingService.this, MainActivity.class);
    intent.putExtra("action", "goToFragment1");
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notification=new NotificationCompat.Builder(this)
            .setSmallIcon(logo)
            .setContentText(remoteMessage.getNotification().getBody())
            .setContentTitle("Naslov")
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);
    NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, notification.build());



}}

And this is my MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dugme=(Button)findViewById(R.id.dugme1);
    dugme2=(Button)findViewById(R.id.subscribe);
    dugme.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Fragment fragment = null;
            if(view==dugme) {
                fragment = new Fragment1();
            }
            FragmentTransaction transaction=getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.myFragment, fragment);
            transaction.addToBackStack(null);
            transaction.setTransition(FragmentTransaction.TRANSIT_NONE);
            transaction.commit();
        }
    });
    String msg=getIntent().getStringExtra("action");
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
    if (msg!=null){
        if (msg.equals("goToFragment1")){
            Fragment1 fragment1=new Fragment1();
            fragmentTransaction.replace(R.id.myFragment, fragment1);
            fragmentTransaction.commit();
        }
    }

    dugme2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseMessaging.getInstance().subscribeToTopic("android");
            Log.d("Log", "Uspesno ste se pretplatili");
        }
    });

}

What should I do?

2条回答
地球回转人心会变
2楼-- · 2019-06-14 11:07

You can use BroadCastReceiver in your fragment. https://developer.android.com/reference/android/content/BroadcastReceiver.html?hl=ru

Try to create something like this:

Override onResume method

IntentFilter filter = new IntentFilter();
filter.addAction("SOME_STRING_CONSTANT");
getActivity().registerReceiver(receiver, filter);

and unregister your receiver in onDestroy method. Now your broadcast receiver can works in background

EDIT

private BroadcastReceiver receiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    if (intent.getAction() == "SOME_STRING_CONSTANT") {
        // do something
    } 
  }
};

@Override
public void onDestroyView() {
   super.onDestroyView();
   getActivity().unregisterReceiver(receiver);
}

You can send an event to broadcast receiver from anywhere

Intent intent = new Intent();
intent.setAction("SOME_STRING_CONSTANT");
startActivity(intent);
查看更多
我想做一个坏孩纸
3楼-- · 2019-06-14 11:08

When your app is in background onNewIntent will be called instead of onCreate.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    String msg=intent.getStringExtra("action");
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
    if (msg!=null){
       if (msg.equals("goToFragment1")){
           Fragment1 fragment1=new Fragment1();
           fragmentTransaction.replace(R.id.myFragment, fragment1);
           fragmentTransaction.commit();
       }
    }
}
查看更多
登录 后发表回答