Подтвердить что ты не робот

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

Я хочу использовать динамически зарегистрированный BroadcastReceiver, который имеет ссылку на Activity, чтобы он мог изменять свой пользовательский интерфейс. Я использую метод 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);
    }

}
4b9b3361

Ответ 1

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

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

Ответ 2

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

Во-первых, ваш 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?