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); }
我认为你的问题是你在其他活动开始之前发送广播! 所以其他活动将不会收到任何东西。
- testing代码的最佳实践是从线程或从服务发送广播,以便打开活动并将其注册到接收方,后台进程将发送消息。
- 从发件人的活动启动ToastDisplay活动(我没有testing,但可能工作)
你忘记在末尾写上.show(),这是用来显示吐司消息。
Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();
这是程序员所犯的一个常见错误,但我相信在这之后你不会再犯这个错误了
你也必须在onCreate()注册接收器,如下所示:
IntentFilter filter = new IntentFilter(); filter.addAction("csinald.meg"); registerReceiver(receiver, filter);