如何使用registerReceiver方法?

Urb*_*oss 45 android broadcastreceiver

我想使用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);
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 39

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

void alarm(Context context, Calendar calendar) {
    AlarmManager alarmManager = (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 anotherIntent = new Intent(SOME_ACTION);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, anotherIntent, 0);
    alramManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

    Toast.makeText(context, "Added", Toast.LENGTH_LONG).show();
}

class AlarmReceiver extends BroadcastReceiver {     
    @Override
    public void onReceive(Context context, Intent arg1) {
        Toast.makeText(context, "Started", Toast.LENGTH_LONG).show();
    }
}
Run Code Online (Sandbox Code Playgroud)


Emm*_*uel 16

广播接收器接收某种类型的事件.我不认为你可以通过类名调用它们.

首先,您的IntentFilter必须包含一个事件.

static final String SOME_ACTION = "com.yourcompany.yourapp.SOME_ACTION";
IntentFilter intentFilter = new IntentFilter(SOME_ACTION);
Run Code Online (Sandbox Code Playgroud)

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

Intent i = new Intent(SOME_ACTION);
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

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

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