2017-12-30 14 views
0

私のアンドロイドアプリでは、firebaseクラウドメッセージングを使用してアプリにデータを送信します。Firebase Cloud Messaging:onMessageReceived()内のUI要素へのアクセス

アプリonMessageReceived()介してメッセージを受信し、Iは(MainActivityMainActivity現在表示への静的参照を持つ)MainActivityが現在表示されているかどうかをチェックし、アクティビティが表示されている場合、私は活動にいくつかの変更を行います。

メインスレッドでonMessageReceived()が呼び出されていないため、Handlerを使用してメインスレッドのコードを実行します。

@Override 
public void onMessageReceived(final RemoteMessage remoteMessage) { 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
     //Access UI 
    }); 
} 

この方法に問題はありますか?そうでない場合は、クラウドメッセージを受信したときに現在表示されているUIを更新する他の方法はありますか?

+2

受信したメッセージでローカルブロードキャストをアクティビティに送信し、そこに変更を加えることができます。 –

答えて

0

特定のアクティビティのUI変更については、onMessageReceived()に直接コードを書くことは避けてください。地元の放送受信機を介してチャンネルを送信できます。

onMessageReceived()に直接コードを書く傾向がある場合は、FirebaseMessagingServiceクラスが混乱するでしょう。たとえば、4種類の通知データがあり、それぞれのデータが異なる活動を呼び出す場合などです。あなたのコードは次のようになります:

@Override 
public void onMessageReceived(final RemoteMessage remoteMessage) { 
    if(remoteMessage.getData() != null 
     && remoteMessage.getData().containsKey("notification_type")){ 
     switch(remoteMessage.getData().containsKey("notification_type")){ 
      case "type1": 
       Handler handler = new Handler(Looper.getMainLooper()); 
       handler.post(new Runnable() { 
        //Access UI for some activity 
        . 
        . 
        . 
       }); 
       break; 
      case "type2": 
       Handler handler = new Handler(Looper.getMainLooper()); 
       handler.post(new Runnable() { 
        //Access UI for some activity 
        . 
        . 
        . 
       }); 
       break; 
      case "type3": 
       Handler handler = new Handler(Looper.getMainLooper()); 
       handler.post(new Runnable() { 
        //Access UI for some activity 
        . 
        . 
        . 

       }); 
       break; 
      case "type4": 
       Handler handler = new Handler(Looper.getMainLooper()); 
       handler.post(new Runnable() { 
        //Access UI for some activity 
        . 
        . 
        . 

       }); 
       break; 

     } 
    } 

} 

また、ローカルブロードキャストを使用すると、コードはモジュール化され、整理されます。

@Override 
public void onMessageReceived(final RemoteMessage remoteMessage) { 
    if(remoteMessage.getData() != null 
     && remoteMessage.getData().containsKey("notification_type")){ 
     Intent intent = new Intent(); 
     intent.putExtra("body",messageBody); // Put info that you want to send to the activity 
     switch(remoteMessage.getData().containsKey("notification_type")){ 
      case "type1": 
       intent.setAction("ACTION_1") // For activity1 
       break; 
      case "type2": 
       intent.setAction("ACTION_2") //For activity2 
       break; 
      case "type3": 
       intent.setAction("ACTION_3") //For activity3 
       break; 
      case "type4": 
       intent.setAction("ACTION_4") //For activity4 
       break; 
     } 
     sendBroadcast(intent); 
    } 

} 

そして、あなたの活動(例えばactivity1)次のようになります:あなたのコードは次のようになります プライベートBroadcastReceiver mReceiverを。

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    IntentFilter intentFilter = new IntentFilter(
      "ACTION_1"); // Put appropriate action string 

    mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      //Get message from intent 
      String msg_for_me = intent.getStringExtra("some_msg"); 
      //Do your UI Changes stuff here. 

     } 
    }; 
    //registering our receiver 
    this.registerReceiver(mReceiver, intentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    this.unregisterReceiver(this.mReceiver);//unregister receiver 
} 

私によれば、これはアクティビティ自体の内部でのUI変更をコード化し、より良いコード管理につなげるのに役立ちます。

希望します。

関連する問題