FirebaseMessagingService单例?控制实例

时间:2016-07-08 01:07:15

标签: firebase firebase-cloud-messaging

我在使用FirebaseMessagingService时遇到问题。 FirebaseMessagingService工作正常。我收到了消息和通知。但我需要将消息发送到Activity打开,并调用活动中的方法。

我尝试创建一个监听器,但是在收到消息时,会创建一个新实例并且监听器为null。我知道,当有消息要接收时,FirebaseMessagingService会被实现。所以我想在单身和听众中一起工作,听众保持无效。

有人知道我如何向开放的活动发送消息?

2 个答案:

答案 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);
}

答案 1 :(得分:0)

尽管不要超过可以使用意图传递的数据大小的限制,但要小心 请参考这里 https://code.google.com/p/android/issues/detail?id=5878

我理解你的问题没有任何代码。对于你来说,这是一个非常好的解决方案。我经常使用这种方法在服务和活动之间传递数据。

您需要做的第一件事是将要传递的数据转换为可以通过intent传递的内容。

字符串很容易使用,因此转换为字符串并放入意图。在活动方面使用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");
            }
        }
    }