设备重启后启动警报管理器
Alarm manager starting after device reboot
我有一个警报管理器,它应该在每年年底 运行。它工作正常,但是当我重新启动我的设备时,此事件在我的设备机器人之后开始,在我的情况下,它清除了我的数据库。但我希望我的 alarmmanager 在重启设备后进入后台并在年底工作,而不是立即:
设备重启 -> 报警管理器启动 -> 年底前不做任何事情 -> 年底 -> 触发
MainActivity.class
public class MainActivity extends AppCompatActivity implements MainView {
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runFullYearTimer();
}
private void runFullYearTimer() {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, FullYearCleaning.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.DATE, 31);
calendar.set(Calendar.MONTH, 11);
presenter.putIntInStorage(YEAR, calendar.get(Calendar.YEAR));
manager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
}
}
FullYearCleaning.class
public class FullYearCleaning extends BroadcastReceiver {
@Inject
GeneralStorageHelper generalStorageHelper;
@Inject
CountryDaoModel countryDaoModel;
@Override
public void onReceive(Context context, Intent intent) {
AndroidInjection.inject(this, context);
Log.d(TAG, "Running ending event!");
countryDaoModel.clearCountriesValues();
generalStorageHelper.putIntIntStorage(SP_HALF_YEAR, NO_HALF_YEAR_NOTIFICATION);
generalStorageHelper.putIntIntStorage(SP_COMPLETE_YEAR, NO_ALL_YEAR_NOTIFICATION);
}
}
清单
<receiver
android:name=".model.FullYearCleaning"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.REBOOT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
我正在使用SharefPrefence 来保存timemilis 和警报id。
设备重启后,我调用 BroadcastReceiver 并使用 timemilis 和来自 SharedPrefence 的警报 ID 创建新警报。
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
//create alarm
}
希望对您有所帮助。
问题是因为使用相同的广播接收器 class 完成启动并触发警报
有两种解决方案可以解决这个问题
- 具有单独的 class 启动完成和警报触发
将 Extras 添加到待处理的 intent 中,并根据接收时的 intent extras 选择要执行的操作。
if(intent.hasExtra("ALARM")){
//clear values
}else{
// create alarm here
}
我有一个警报管理器,它应该在每年年底 运行。它工作正常,但是当我重新启动我的设备时,此事件在我的设备机器人之后开始,在我的情况下,它清除了我的数据库。但我希望我的 alarmmanager 在重启设备后进入后台并在年底工作,而不是立即:
设备重启 -> 报警管理器启动 -> 年底前不做任何事情 -> 年底 -> 触发
MainActivity.class
public class MainActivity extends AppCompatActivity implements MainView {
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runFullYearTimer();
}
private void runFullYearTimer() {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, FullYearCleaning.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.DATE, 31);
calendar.set(Calendar.MONTH, 11);
presenter.putIntInStorage(YEAR, calendar.get(Calendar.YEAR));
manager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
}
}
FullYearCleaning.class
public class FullYearCleaning extends BroadcastReceiver {
@Inject
GeneralStorageHelper generalStorageHelper;
@Inject
CountryDaoModel countryDaoModel;
@Override
public void onReceive(Context context, Intent intent) {
AndroidInjection.inject(this, context);
Log.d(TAG, "Running ending event!");
countryDaoModel.clearCountriesValues();
generalStorageHelper.putIntIntStorage(SP_HALF_YEAR, NO_HALF_YEAR_NOTIFICATION);
generalStorageHelper.putIntIntStorage(SP_COMPLETE_YEAR, NO_ALL_YEAR_NOTIFICATION);
}
}
清单
<receiver
android:name=".model.FullYearCleaning"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.REBOOT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
我正在使用SharefPrefence 来保存timemilis 和警报id。 设备重启后,我调用 BroadcastReceiver 并使用 timemilis 和来自 SharedPrefence 的警报 ID 创建新警报。
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
//create alarm
}
希望对您有所帮助。
问题是因为使用相同的广播接收器 class 完成启动并触发警报 有两种解决方案可以解决这个问题
- 具有单独的 class 启动完成和警报触发
将 Extras 添加到待处理的 intent 中,并根据接收时的 intent extras 选择要执行的操作。
if(intent.hasExtra("ALARM")){ //clear values }else{ // create alarm here }