【发布时间】:2015-05-05 17:20:51
【问题描述】:
我正在尝试制作一个聊天应用程序。我有一个SlidingDrawer 活动,它有很多片段,其中ChatFragment 是一个。现在当我向我的朋友发送消息时,我有一个Chatting Window 和如果有任何消息来自GCM 服务并且我在ChatFragment 中,那么此消息将转到该片段并更新列表视图,因为我想在聊天时收到任何消息时更新 chatWindow 现在我尝试执行以下操作。
GcmIntentService :
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"));
LocalBroadcastManager.getInstance(this).sendBroadcast(sendData);
Log.i("chat","i am in GCMIntentService");
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
这里我在 onHandleIntent() 中启动一个广播接收器。
ChatBroadCastReceiver:
public class ChatBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("chat","I am in ChatBroadCastReceiver");
String msg = intent.getStringExtra("msg");
Log.i("chat",msg);
//Intent data = new Intent("chatupdater");
//Intent data = new Intent("chatupdater");
//data.putExtra("key","data");
//data.putInt("fragmentno",1); // Pass the unique id of fragment we talked abt earlier
//context.sendBroadcast(intent);
}
}
这是我的 ChatBroadCastReceiver 类,如果有任何消息,它会通过 onReceive() 方法成功接收。现在我想将此消息发送到 Fragment。我尝试了什么,我用它注册了 Fragment 并尝试获取ChatFragment 的 onReceive() 的数据相同。但它没有调用。我试图通过记录查看。
public class ChatFragment extends Fragment {
//ChatBroadCastReceiver mReceiver;
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() {
}
public BroadcastReceiver mReceiver = 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();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReceiver = new ChatBroadCastReceiver();
//getActivity().registerReceiver(new ChatBroadCastReceiver(),new IntentFilter("chatupdater"));
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(new ChatBroadCastReceiver(),new IntentFilter("chatupdater"));
Log.i("chat", "I am in onCreate");
}
现在我怎样才能将我在 Broadcastreceiver 中收到的消息发送到 ChatFragment 的 onReceive()??
【问题讨论】:
-
LocalBroadcastManager.getInstance()有什么用?
-
我从一个答案中得到了这句话。" 如果您的广播接收器在一个片段中,请使用 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice); 注册它并使用 LocalBroadcastManager.getInstance 取消注册(getActivity()).unregisterReceiver(onNotice);"。但我尝试不使用 LocalBroadCastManager 但结果相同。
-
如果你知道任何其他方式,你可以建议我。 @Dhaval 帕特尔
-
好的,我对 LocalBroadcastManager 做了一些研究,发现 this 非常有帮助。可能与您的问题无关。
-
我想让你评论 mReceiver = new ChatBroadCastReceiver();行并尝试 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater"));
标签: android service broadcastreceiver fragment google-cloud-messaging