如何使用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中声明的吗?