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"))
发送广播时,您也将使用相同的操作
我有一个 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:
的 BroadcastReceiverpublic 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"))