2016-07-08 87 views
0

我在使用FirebaseMessagingService时遇到问题。 FirebaseMessagingService工作正常。我收到消息和通知。但是我需要将消息发送给Activity,并在Activity中调用一个方法。FirebaseMessagingService单身?控制实例

我试着创建一个侦听器,但是当收到一条消息时,创建了一个新的实例,并且侦听器为空。据我所知,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

要小心,虽然完全不超过限制数据大小可以使用intent来传递 这里是指 https://code.google.com/p/android/issues/detail?id=5878

我明白你的问题没有任何代码。这几乎是你应该工作的一个交钥匙解决方案。我使用这种方法在服务和活动之间传递数据。

您首先需要将要传递的数据转换为可以通过意图传递的数据。

字符串很容易处理,所以转换为字符串并放入一个意图。在使用onCreate和onNewItent的活动端,您可以收到这些数据没有问题。然后将其转换回来,无论您希望如何。请参阅下面的代码以获取示例。

如果接收方不是unRegistered,使用广播接收方可能会给你数据泄漏。它会发生,如果你的应用程序崩溃,并且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"); 
      } 
     } 
    }