2016-11-13 68 views
0

我剛剛熟悉本地廣播消息。我有2個活動。我的活動未收到其他活動發送的本地廣播

MainActivity:

我有2個按鈕。點擊1按鈕,我正在廣播消息。點擊另一個,我正在導航到第二個活動。

public class MainActivity extends AppCompatActivity { 

Button btn; 
    Button btn1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button)findViewById(R.id.sendBroadCast); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
        sendMessage(); 
      } 
     }); 
     btn1 = (Button)findViewById(R.id.btn); 
     btn1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(MainActivity.this,SecondActivity.class); 
       startActivity(intent); 
      } 
     }); 

    } 
    void sendMessage(){ 
     Log.d("RAK","Gonna send braodcast"); 
     Intent intent = new Intent("customMsg"); 
     intent.putExtra("message", "This is my message!"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 
} 

第二活動:

註冊對該活動的onCreate接收機。

public class SecondActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second); 
     Log.d("RAK","In oncreate of second activity.Registered for local receiver"); 
     LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, 
       new IntentFilter("customMsg")); 

    } 
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Get extra data included in the Intent 
      String message = intent.getStringExtra("message"); 
      Log.d("receiver", "Got message: " + message); 
     } 
    }; 

    @Override 
    protected void onDestroy() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
     super.onDestroy(); 
    } 
} 

我面臨的問題是,第二個Activity沒有收到廣播。請幫幫我。

P.S:請不要標記爲重複。我按照這個鏈接:how to use LocalBroadcastManager?

感謝, 拉克什

+0

你怎麼樣ry發送消息? 我的意思是, 首先你運行你的應用程序,然後點擊第二個按鈕? – Pein

+0

當你點擊'btn1'然後回去點擊'btn'時會發生什麼? –

回答

2

以便接收廣播的第二個活動應達到和而第一個被髮送廣播,這將是很難在運行您的案例(2個活動沒有同時運行)。
您的第一個活動發送廣播,但沒有任何活動(在您的情況下,第二個活動)啓動,所以messgae會'丟失'。
您可以通過服務內的廣播進行測試,例如,您的第二個活動正在運行。然後,活動可以處理/接收它。

你可能想要做的是使用extraData將字符串傳遞給secondActivity。如果您想測試BroadcastReceiver,那麼請嘗試使用發送廣播的服務!

+0

這幾乎是正確的,但是如果您將在ondestroy中註冊接收器並取消註冊,則可以將廣播發送到後臺活動。 但是之前它的創建方法應該被調用。 – Pein

+0

@Anto,謝謝你的回覆。不過,我需要更多的澄清。 如您所說,2個活動不能同時運行。假設我有一個活動正在發送本地廣播(說它發送一個數字)的情況。我有多個接收器。接收者應該接收由Activity發送的本地廣播並相應地執行(不管)。您如何通過本地廣播實現這一目標? 2.如果我在從最初的Activity發送廣播之前啓動了SecondActivity(在上例中),SecondActivity會收到它嗎? – Rakesh

0

問題是你的廣播接收器在第二個活動的onCreate()裏面註冊,這意味着第二個活動應該在你廣播你的意圖之前先發起,記住當第二個活動被破壞時你不註銷它。

註冊靜態保證接收器在系統啓動時註冊或:

替代你可以在清單文件

public class Receiver extends BroadcastReceiver{ 
    public void onReceive(Context context, Intent intent) { 
    // Whatever 
    } 
} 

清單

<receiver 
    android:name=".Receiver" 
    android:exported="false" > 
    <intent-filter> 
    <action android:name="customMsg" />    
    </intent-filter> 
</receiver> 

注意靜態註冊您的接收器當應用程序在運行時添加時

+0

如果我在Android清單中註冊相同,即使我不啓動第二個活動,SecondActivity會接收本地廣播嗎? – Rakesh

+0

是的,如果你真的註冊靜態,不需要啓動第二項活動 –