如何使用registerReceiver方法?

我想要使​​用dynamic注册的BroadcastReceiver来引用一个Activity以便修改它的UI。 我正在使用Context.registerReceiver()方法,但接收方的onReceive()方法永远不会被调用。

以下是显示问题的示例代码:

 package com.example; import android.app.Activity; import android.app.IntentService; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; public class RegisterBroadcastReceiver extends Activity { public static class MyIntentService extends IntentService { public MyIntentService() { super(MyIntentService.class.getSimpleName()); } @Override protected void onHandleIntent(Intent intent) { Intent i = new Intent(this, MyBroadcastReceiver.class); sendBroadcast(i); } } public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(MyBroadcastReceiver.class.getSimpleName(), "received broadcast"); } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); registerReceiver(mReceiver, intentFilter); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { Intent i = new Intent(this, MyIntentService.class); startService(i); } return super.onKeyDown(keyCode, event); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mReceiver); } } 

整个代码,如果有人需要它。

 void Alarm(Context context, Calendar c) { AlarmManager alrm = (AlarmManager)context.getSystemService(ALARM_SERVICE); final String SOME_ACTION = "com.android.mytabs.MytabsActivity.AlarmReceiver"; IntentFilter intentFilter = new IntentFilter(SOME_ACTION); AlarmReceiver mReceiver = new AlarmReceiver(); context.registerReceiver(mReceiver, intentFilter); Intent i2 = new Intent(SOME_ACTION); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i2, 0); alrm.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); Toast.makeText(context, "Added", Toast.LENGTH_LONG).show(); } class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { // TODO Auto-generated method stub Toast.makeText(context, "Started", Toast.LENGTH_LONG).show(); } } 

广播接收机接收某种types的事件。 我不认为你可以通过类名来调用它们。

首先,你的IntentFilter必须包含一个事件。

 static final String SOME_ACTION = "com.yourcompany.yourapp.SOME_ACTION"; IntentFilter intentFilter = new IntentFilter(SOME_ACTION); 

其次,当您发送广播时,请使用相同的操作:

 Intent i = new Intent(SOME_ACTION); sendBroadcast(i); 

第三,你真的需要MyIntentService是内联吗? 静态的? [编辑]我发现MyIntentSerivce必须是静态的,如果它是内联的。

第四,你的服务是在AndroidManifest.xml中声明的吗?