Intereting Posts

Как использовать метод registerReceiver?

Я хочу использовать динамически зарегистрированный BroadcastReceiver который имеет ссылку на Activity чтобы он мог изменять свой пользовательский интерфейс. Я использую Context.registerReceiver() но метод Context.registerReceiver() получателя никогда не вызывается.

Вот пример кода, показывающий проблему:

 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); } } 

Solutions Collecting From Web of "Как использовать метод registerReceiver?"

Весь код, если кому-то это нужно.

 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(); } } 

Приемники широковещательной передачи получают события определенного типа. Я не думаю, что вы можете вызвать их по имени класса.

Во-первых, ваш 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 был встроенным? Статическая? [EDIT] Я обнаружил, что MyIntentSerivce ДОЛЖЕН быть статичным, если он встроен.

В-четвертых, объявлен ли ваш сервис в AndroidManifest.xml?