我有一個BroadcastReceiver,當我把它作爲一個單獨的類並在Manifest中註冊時它工作正常。但是,我需要它作爲內部類,因爲如果應用程序位於前臺並且我必須以編程方式註冊它(因爲要將其註冊到Manifest文件中,它必須是靜態的,因此不能訪問非靜態外部類方法)。Android:以編程方式註冊接收器不工作
我試圖像這樣做,但它只是什麼也不做(我改變用於測試目的小時和分鐘)
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);
這是廣播接收器作爲一個內部類:
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();
}
}
發送廣播時,您也將使用相同的操作一個空的'IntentFilter'?我從來沒有嘗試過這樣,但我不認爲這有效。對於廣播,你通常會對一個動作進行過濾,並將相同的動作作爲參數傳遞給過濾器和意圖的構造函數。 – 0xDEADC0DE
當我在manifestxt.xml中註冊它時,它沒有使用意圖過濾器。你能告訴我我會放在那裏嗎? –