Android:以编程方式注册 Receiver 不工作

Android: programatically registering Receiver not working

我有一个 BroadcastReceiver,当我将它作为一个单独的 class 并在清单中注册时它工作正常。但是,我需要它作为内部 class,因为如果应用程序在前台,我想刷新 UI 的部分,为此我必须以编程方式注册它(因为为了注册它在 Manifest 文件中,它必须是静态的,因此无法访问非静态外部 class 方法)。

我正在尝试这样做,但它什么也没做(出于测试目的我更改了小时和分钟)

registerReceiver(new DayCheckReceiver(), new IntentFilter());

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
dayCheckIntent = new Intent(this, DayCheckReceiver.class);

dayCheckAlarmIntent = PendingIntent.getBroadcast(this, 2000000000, dayCheckIntent, 0); // i use this high number because i use 1+ for a growing list
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 14);
calendar.set(Calendar.MINUTE, 19);
if (calendar.before(Calendar.getInstance())) {
    calendar.add(Calendar.DATE, 1);
}
alarmManager.setExact(AlarmManager.RTC, calendar.getTimeInMillis(), dayCheckAlarmIntent);

这是作为内部 Class:

的 BroadcastReceiver
public class DayCheckReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        //load
        SharedPreferences sharedPrefs = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPrefs.getString(TASKLIST_FILE, null);
        Type type = new TypeToken<ArrayList<TaskItem>>() {
        }.getType();
        mTaskList = gson.fromJson(json, type);

        //modifications
        if (mTaskList != null && mTaskList.size() > 0) {
            for (int i = 0; i < mTaskList.size(); i++) {
                mTaskList.get(i).shiftDayChecks();
                mTaskList.get(i).resetTimeLeft();
            }
        }

        //save
        SharedPreferences.Editor editor = sharedPrefs.edit();
        gson = new Gson();
        json = gson.toJson(mTaskList);
        editor.putString(TASKLIST_FILE, json);
        editor.apply();

        tasksFragment.loadTaskList();
        tasksFragment.updateTaskList();
    }
}

您需要修改注册行。

registerReceiver(mReceiver, new IntentFilter(action));

其中 mReceiver 是 BroadcastReceiver 的对象,action 是 BroadcastReceiver 将侦听的字符串。

然后在 BroadcastReceiver 中,您需要在执行任何其他操作之前检查操作。

public static final String CONSTANT_ACTION = "broadcast_action";

mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (null != intent && CONSTANT_ACTION.equals(intent.getAction()))
                // Write your code here
        }
    };

这就是您直播活动的方式

Intent intent = new Intent(CONSTANT_ACTION);
sendBroadcast(intent);

您需要在您的 intentfilter 中执行一些操作,比如 new IntentFilter("Alarm")。使用 sendBroadcast(new Intent("Alarm"))

发送广播时,您也将使用相同的操作