Диспетчер тревог запускается после перезагрузки устройства - PullRequest
0 голосов
/ 22 мая 2018

У меня есть менеджер аварийных сигналов, который должен запускаться в конце каждого года.Это нормально работает, но когда я перезагружаю свое устройство, это событие запускается после моего робота устройства, который, в моем случае, очищает мою базу данных.Но я хочу, чтобы мой менеджер аварийных сигналов уходил в фоновый режим после перезагрузки устройства и работал в конце года, а не сразу:

перезагрузка устройства -> запуск диспетчера аварийных сигналов -> не делать все до концагод -> конец года-> триггер

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>

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Проблема связана с использованием одного и того же класса приемника широковещания для завершения загрузки и срабатывания тревоги. Есть два решения для преодоления этой проблемы

  1. Наличие отдельных классов для завершения загрузки и запуска тревоги
  2. добавление дополнений к ожидаемому намерению и в зависимости от намерения дополнений при получении вы можете выбрать, что делать.

    if(intent.hasExtra("ALARM")){ //clear values }else{ // create alarm here }

0 голосов
/ 22 мая 2018

Я использую SharefPrefence, чтобы сохранить timemilis и идентификатор тревоги.после перезагрузки устройства я вызываю BroadcastReceiver и создаю новый сигнал тревоги с timemilis и идентификатором тревоги из SharedPrefence.

if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { //create alarm }

Надеюсь, это поможет вам.

...