2016-07-08 6 views
0

У меня возникла проблема с использованием FirebaseMessagingService. FirebaseMessagingService отлично работает. Я получаю сообщения и уведомления. Но мне нужно отправить сообщение в Activity open и вызвать метод в действии.FirebaseMessagingService singleton? Управление экземпляром

Я попытался создать прослушиватель, но при приеме сообщения создается новый экземпляр, а слушатель - нуль. Я понимаю, что FirebaseMessagingService является instanciated, когда есть сообщение для получения. Поэтому я думал, что в одиночном и слушателе вместе, не работает, слушатель держит нуль.

У кого-то есть идея, как я могу отправить сообщение открытому действию?

+0

выкладывания код будет гораздо лучше. –

ответ

1

Я не думаю, что для этого нужны слушатели. Как только вы получите сообщение в onMessageReceived(), просто передайте его, используя LocalBroadcastmanager. и получать эту трансляцию в своей деятельности.

Ниже приведен фрагмент кода, чтобы достичь того, чего вы хотите:

MyFirebaseMessagingService.java:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Intent intent = new Intent(**Action**); 
     intent.putExtra("Some Payload", message.getBody()); 
     mLocalBroadcastManager.sendBroadcast(intent); 
} 

MainActivity.java:

private LocalBroadcastManager mLocalBroadcastManager; 
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    } 
}; 

@Override 
protected void onStart() { 
    super.onStart(); 
    registerBroadcastReceiver(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    unregisterBroadcastReceiver(); 
} 

private void registerBroadcastReceiver() { 
    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(**Action**); 
    mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); 
} 

private void unregisterBroadcastReceiver() { 
    mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver); 
} 
+0

Я попробую это, спасибо – novac

0

Будьте уход за полный, хотя и не превышать ограничений размеров данных, которые могут быть переданы с использованием намерений см. здесь https://code.google.com/p/android/issues/detail?id=5878

Я понял ваш вопрос без кода. Вот в значительной степени решение под ключ для вас, которое должно работать. Я использую этот метод для передачи данных между службами и действиями.

Прежде всего вам нужно преобразовать данные, которые вы хотите передать, к чему-либо, что может быть передано через намерение.

Строки просты в использовании, поэтому преобразуйте их в строку и заведите в цель. На стороне деятельности, использующей onCreate и onNewItent, вы можете получить эти данные без проблем. Затем преобразуйте обратно, как пожелаете. См. Приведенный ниже код.

Работа с широковещательными приемниками дает возможность утечки данных, если приемник не зарегистрирован. Это произойдет, если приложение завершится сбой, а unRegister не будет выключен.

В классе FirebaseMessagingService

import android.os.AsyncTask; 
    import com.google.firebase.messaging.FirebaseMessagingService; 
    import com.google.firebase.messaging.RemoteMessage; 
    import org.json.JSONException; 
    import org.json.JSONObject; 
    import java.util.Map; 

    /** 
    * Created by acopp 
    * Date: 12/31/2016. 
    * Time: 1:41 PM 

    * You have permission to use this file for any reason that is not for evil doing 
    */ 

    public class FBMService extends FirebaseMessagingService { 
     static String TAG = "FBMService"; 
     static String FBMServiceAction = "FBMService.Action"; 

     @Override 
     public void onMessageReceived(RemoteMessage remoteMessage) { 
      MainActivity.passIntent(this,FBMServiceAction,getString(remoteMessage)); 
     } 
     String getString(RemoteMessage message){ 
      Map<String, String> messageData = message.getData(); 
      JSONObject j = new JSONObject(); 
      for (String key : messageData.keySet()) { 
       String value = messageData.get(key); 
       try { 
        j.put(key, value); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      return j.toString(); 
     } 

    } 

активность Класс

//In your activity class 

    import android.app.Activity; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.util.Log; 
    import org.json.JSONException; 
    import org.json.JSONObject; 
    import java.util.HashMap; 
    import java.util.Iterator; 
    import java.util.Map; 

    /** 
    * Created by acopp 
    * Date: 12/31/2016. 
    * Time: 1:41 PM 
    * You have permission to use this file for any reason that is not for evil doing 
    */ 

    public class MainActivity extends Activity { 
     private String TAG = "MainActivity"; 

     //Call this from FBMService to start your activity or if your activity is start to receive a new intent 
     static void passIntent(Context context, String action, String messageDataString) { 
      Intent intent = new Intent(context, MainActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.putExtra("action", action); 
      intent.putExtra("message", messageDataString); 
      context.startActivity(intent); 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d(TAG, "onCreate"); 
      intentHandler(getIntent()); 
     } 
     @Override 
     protected void onNewIntent(Intent intent) { 
      super.onNewIntent(intent); 
      Log.d(TAG, "onNewIntent"); 
      intentHandler(intent); 
     } 
     //Use an intent handler to manage onNewIntent and onCreate the same way 
     void intentHandler(Intent intent) { 
      if (intent.hasExtra("action")) { 
       String action = intent.getStringExtra("action"); 
       if(action.equals(FBMService.FBMServiceAction)){ 
        if (intent.hasExtra("message")) { 
         String messageDataString = intent.getStringExtra("message"); 
         new iterEat().execute(messageDataString); 
        } 
       } 
      } 
     } 
     //Convert your string to a HashMap in the background off the main thread 
     class iterEat extends AsyncTask<String,Void,Map<String, String> > { 
      @Override 
      protected Map<String, String> doInBackground(String... rm) { 
       String messageDataString = rm[0]; 
       try{ 
        return fromString(messageDataString); 
       }catch (NullPointerException e){ 
        return null; 
       } 
      } 
      @Override 
      protected void onPostExecute(Map<String, String> s) { 
       //Your data is pooped out here 
       Map<String, String> messageData = s;//PLOP 
      } 
     } 

     Map<String, String> fromString(String jsonString) throws NullPointerException{ 
      try { 
       Map<String, String> messageData = new HashMap<>(); 
       JSONObject j = new JSONObject(jsonString); 
       Iterator<String> i = j.keys(); 
       while(i.hasNext()){ 
        String key = i.next(); 
        String value = j.getString(key); 
        messageData.put(key,value); 
       } 
       return messageData; 

      } catch (JSONException e) { 
       throw new NullPointerException("Didn't work"); 
      } 
     } 
    } 
Смежные вопросы