2016-11-13 80 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

是的,如果你真的注册静态,不需要启动第二项活动 –