Android:以编程方式注册Receiver无法正常工作

时间:2017-08-29 14:42:37

标签: android broadcastreceiver

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

我试图这样做,但它什么也没做(我为测试目的改变了小时和分钟)

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

这是作为内部类的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();
    }
}

2 个答案:

答案 0 :(得分:1)

您需要修改注册行。

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

答案 1 :(得分:1)

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

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