Calling BroadCastReceiver from Service in android

2019-04-02 01:32发布

问题:

I want to update the UI of a fragment from service.I am using GCM for sending message.I have this class for GCM:

    public class GcmIntentService extends IntentService {

        public GcmIntentService() {
            super("GcmIntentService");
        }

        @Override
        protected void onHandleIntent(Intent intent) {
            Bundle extras = intent.getExtras();
            GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
            // The getMessageType() intent parameter must be the intent you received
            // in your BroadcastReceiver.
            String messageType = gcm.getMessageType(intent);

            if (extras != null && !extras.isEmpty()) {  // has effect of unparcelling Bundle
                // Since we're not using two way messaging, this is all we really to check for
                if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                    Logger.getLogger("GCM_RECEIVED").log(Level.INFO, extras.toString());

                    showToast(extras.getString("message"));
                    Intent sendData = new Intent("chatupdater");
                    sendData.putExtra("msg",extras.getString("message"));
                    sendBroadcast(sendData);


                }
            }
   GcmBroadcastReceiver.completeWakefulIntent(intent);
        }

In the onHandleIntent() method i broadcasted the message to a fragment which is registered to BroadCastReceiver.I have one SlidingDrawerActivity and it has many Fragments and ChatFragment is one of them.I want to send this message from GCMIntentService to ChatFragment.

My ChatFragment class:

public class ChatFragment extends Fragment {

    private EditText et_chat;
    Bundle mailData;
    String caller_mail;
    private ListView chatListview;
    private ChatWindowAdapter chatWindowAdapter;
    private List<ChatSession>PreviousChatSession;
    private List<ChatInfo> chatListItems;
    Button chat_send;
    public ChatFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        getActivity().registerReceiver(new ChatBroadCastReceiver(),new IntentFilter("chatupdater"));

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.chat_window, null, false);
        et_chat = (EditText) v.findViewById(R.id.et_chat);
        chat_send = (Button) v.findViewById(R.id.bt_chat_send);
        chatListview = (ListView)v.findViewById(R.id.chat_listView);
        chatListItems = new ArrayList<ChatInfo>();
        chatWindowAdapter = new ChatWindowAdapter(getActivity(),chatListItems);
        chatListview.setAdapter(chatWindowAdapter);
        mailData=getArguments();
        caller_mail = mailData.getString(PropertyNames.Userinfo_Mail.getProperty());

        retrieveChats();

        chat_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChatInfo chatInfo= new ChatInfo();
                chatInfo.setChat_text(et_chat.getText().toString());
                chatInfo.setDirection("right");
                chatListItems.add(chatInfo);
                chatWindowAdapter.notifyDataSetChanged();

                fetchID(caller_mail);
            }
        });

        return v;
    }

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
             String msg = intent.getStringExtra("msg");
             Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
        }
    };

My ChatBroadCastReceiver Class for chatFragment :

public class ChatBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}  

I am sending the message with intent in sendBroadcast(sendData) and receiving it inside chatFragment and in onReceive() method i want to see the message in Toast.But Toast is not showing.
Did i implement BroadcastReceiver correctly for fragment inside service??

EDIT: I have debugged and saw that below portion is not calling

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("chat","I am in BroadCastReceiver");
         String msg = intent.getStringExtra("msg");
         Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
    }
};

Do I have to include anything in the menifest about the receiver??

回答1:

In your fragment class use this snippet:

1. register broadcast:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getActivity().registerReceiver(this.broadCastNewMessage, new IntentFilter("bcNewMessage"));
        ...
    }

2. declare your broadcast:

BroadcastReceiver broadCastNewMessage = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
         // here you can update your db with new messages and update the ui (chat message list)
         msgAdapter.notifyDataSetChanged();
         mListView.requestLayout();
         ...
    }
}

3. unregister your broadcast:

@Override
    public void onDestroy() {
        super.onDestroy();
        getActivity().unregisterReceiver(broadCastNewMessage);
    }

Then in your service call sendBroadcast() method:

this.sendBroadcast(new Intent().setAction("bcNewMessage"));

Enjoy!