Activity中的Android BroadcastReceiver

我只是尝试这个小样本项目,它所做的一切:活动一有一个button,发送广播。 活动二收到时显示敬酒。 下面是代码,广播从来没有收到。 我做错了什么?

发送广播

public class SendBroadcast extends Activity { public static String BROADCAST_ACTION = "com.unitedcoders.android.broadcasttest.SHOWTOAST"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void sendBroadcast(View v){ Intent broadcast = new Intent(); broadcast.setAction(BROADCAST_ACTION); sendBroadcast(broadcast); } } 

接收它

 public class ToastDisplay extends Activity { private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT); } }; @Override protected void onResume() { IntentFilter filter = new IntentFilter(); filter.addAction(SendBroadcast.BROADCAST_ACTION); registerReceiver(receiver, filter); super.onResume(); } @Override protected void onPause() { unregisterReceiver(receiver); super.onPause(); } } 

performance

 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SendBroadcast" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ToastDisplay"> <intent-filter> <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"></action> </intent-filter> </activity> </application> 

我做错了什么?

ToastDisplay的源代码是OK的(我的是类似的,并且工作),但它只会收到一些东西,如果它目前在前台(你在onResume注册接收器)。 但是,如果显示不同的活动(在本例中为SendBroadcast活动),则无法收到任何内容。

相反,你可能想从第一个活动开始活动ToastDisplay?

BroadcastReceiver和Activity在不同的用例中是有意义的。 在我的应用程序中,我需要从后台GPS跟踪服务接收通知,并将其显示在活动中(如果活动处于前台 )。

没有必要在清单中注册接收者 。 这在我的用例中甚至是有害的 – 我的接收者操作活动的UI,并且如果活动当前未被显示,则在onReceive期间UI将不可用。 而是按照BroadcastReceiver文档中的描述,在onResume和onPause上注册和取消注册接收器进行活动:

您可以使用Context.registerReceiver()dynamic注册此类的实例,也可以通过AndroidManifest.xml中的标记静态发布实现。

  Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT); 

敬酒,但没有performance出来。

你必须做Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

您需要将接收者定义为清单中的类,并且将会收到意图:

 <application .... <receiver android:name=".ToastReceiver"> <intent-filter> <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/> </intent-filter> </receiver> </application> 

而且您不需要在ToastDisplay中手动创build类。

在您提供的代码中,您必须在ToastDisplay活动中才能实际接收Intent。

使用BroadcastReceiver扩展ToastDisplay类,并在清单文件中注册接收器,并且不要在onResume()中注册您的广播接收器。

 <application .... <receiver android:name=".ToastDisplay"> <intent-filter> <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/> </intent-filter> </receiver> </application> 

如果你想注册的活动,然后在onCreate()方法注册,例如:

 onCreate(){ sentSmsBroadcastCome = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "SMS SENT!!", Toast.LENGTH_SHORT).show(); } }; IntentFilter filterSend = new IntentFilter(); filterSend.addAction("m.sent"); registerReceiver(sentSmsBroadcastCome, filterSend); } 

我认为你的问题是你在其他活动开始之前发送广播! 所以其他活动将不会收到任何东西。

  1. testing代码的最佳实践是从线程或从服务发送广播,以便打开活动并将其注册到接收方,后台进程将发送消息。
  2. 从发件人的活动启动ToastDisplay活动(我没有testing,但可能工作)

你忘记在末尾写上.show(),这是用来显示吐司消息。

 Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show(); 

这是程序员所犯的一个常见错误,但我相信在这之后你不会再犯这个错误了

你也必须在onCreate()注册接收器,如下所示:

 IntentFilter filter = new IntentFilter(); filter.addAction("csinald.meg"); registerReceiver(receiver, filter);