我有一个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();
}
}
答案 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"))