2

Я пытаюсь сделать чат-приложение. У меня есть SlidingDrawer Активность, и у него много фрагментов, среди которых ChatFragment is one.Now, когда я отправляю сообщение своему другу, я имеют Chatting Window, и если какое-либо сообщение поступает из GCM службы, и я в ChatFragment, то это сообщение перейдет к этому фрагменту и обновит список, поскольку я хочу обновить chatWindow, когда какое-либо сообщение появляется во время беседы. Теперь я попытался сделать, как показано ниже.

GcmIntentService:Как отправить данные из BroadcastReceiver в Fragment в android

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

Здесь я начала BroadcastReceiver в 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() method.Now я хочу послать это сообщение Fragment.What я пытался, я зарегистрирован Фрагмент с ним и попытался получить те же данные на onReceive()ChatFragment. Но он не вызывал. Я пытался увидеть, выполнив регистрацию.

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 к OnReceive() из ChatFragment ??

+0

Что такое LocalBroadcastManager.getInstance()? –

+0

Я получил эту цитату из одного ответа. «Если ваш широковещательный приемник находится в фрагменте, зарегистрируйте его с помощью LocalBroadcastManager.getInstance (getActivity()). RegisterReceiver (onNotice) и отмените регистрацию с помощью LocalBroadcastManager.getInstance (getActivity()). UnregisterReceiver (onNotice) ". Но я попытался обойтись без LocalBroadCastManager, но тот же результат. –

+0

, если вы знаете любой другой способ, который вы можете мне предложить. @ Dhaval patel –

ответ

2

Чтобы зарегистрировать свой Broadcast Вы используете:

mReceiver = new ChatBroadCastReceiver(); 
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater")); 

Таким образом, вы будете получать только Вещание ChatBroadCastReceiver класса. Потому что mReceiver - это экземпляр класса ChatBroadCastReceiver.

Теперь для получения широковещательного сообщения на анонимном классе, который вы создали в своем ChatFragment, вам необходимо зарегистрироваться, как показано ниже. Где mReceiver - это экземпляр анонимного класса BroadcastReceiver, который вы внедрили в свой класс ChatFragment.

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater")) 

принимать широковещательные сообщения как на ChatFragment и ChatBroadCastReceiver вам необходимо зарегистрировать широковещательный приемник дважды.

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver ,new IntentFilter("chatupdater")) 

ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); 
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mChatBroadCastReceiver ,new IntentFilter("chatupdater")) 

Надеюсь, что этот ответ поможет вам понять вашу проблему.

+0

Вы имеете в виду ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); LocalBroadcastManager.getInstance (getActivity()). RegisterReceiver (mChatBroadCastReceiver, новый IntentFilter («chatupdater»)) для включения в ChatBroadCastReceiverclass или в ChatFragment onCreate(). –

+0

@setu basak yeh вы правы. Зарегистрируйтесь в mChatBroadCastReceiver, если вы хотите получать трансляцию в классе ChatBroadCastReceiver или Rigister с помощью mReceiver, если вы хотите получать трансляцию в вашем классе ChatFragment. –

+0

Я смущен, когда вы хотите, чтобы я писал эти строки ChatBroadCastReceiver mChatBroadCastReceiver = new ChatBroadCastReceiver(); LocalBroadcastManager.getInstance (getActivity()). RegisterReceiver (mChatBroadCastReceiver, новый IntentFilter («chatupdater»)). Вы хотите, чтобы я написал в классе ChatBroadCaster onCreate(). –

3

Попробуйте

  • Создайте интерфейс, который будет иметь метод, как это.

    public interface DemoListener { public void receiveMessage(String message); }

Теперь реализовать это в вашем фрагменте и зарегистрировать слушатель в BroadcastReceiver, теперь как только ваш вещательный приемник принимает любое сообщение, оно будет доступно для вашего фрагмента с помощью этого приемника.
Надеюсь, это поможет.

Смежные вопросы