Почему BroadcastReceiver вызывается несколько раз? - PullRequest
0 голосов
/ 20 мая 2019

Мой OnReceive () BroadcastReceiver вызывается как каждый раз, когда я открываю приложение, хотя сигнал тревоги срабатывает только один раз в 03:00.

Я регистрирую время последнего вызова onReceive (), поэтому я почти уверен, что onReceive () несколько не работает. Также кажется, что код onReceive () выполняется только после того, как я действительно запускаю приложение, а не только когда приложение закрыто (и фактическое выполнение кода ДОЛЖНО произойти)

MonthManager.java

public class MonthManager extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("BISASAM","triggered");
        SharedPreferences preferences = context.getSharedPreferences(MainActivity.sharedPrefs, Context.MODE_PRIVATE);
        SharedPreferences.Editor editPrefs = preferences.edit();
        DateFormat date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.GERMANY);
        Date dat = new Date();
        Log.d("TRIGGERDATE",date.format(dat));
        editPrefs.putString("REC", "Receiver called "+date.format(dat));
        editPrefs.commit();
    }
}

MainActivity.java

public static final String alarm = "com.example.aufgaben_planer.alarm";
private void registerMyAlarmBroadcast()
    {
        createPendingIntent();
        alarmManager.cancel(pendingIntent);
        alarmManager.cancel(PendingIntent.getBroadcast(this,0,new Intent(alarm),0));
        alarmManager.cancel(PendingIntent.getBroadcast(this,0,new Intent(alarm),PendingIntent.FLAG_CANCEL_CURRENT));
        alarmManager.cancel(PendingIntent.getBroadcast(this,0,new Intent(alarm),PendingIntent.FLAG_UPDATE_CURRENT));
        alarmManager.cancel(PendingIntent.getBroadcast(this,0,new Intent(this,MonthManager.class),PendingIntent.FLAG_UPDATE_CURRENT));
        alarmManager.cancel(PendingIntent.getBroadcast(this,0,new Intent(this,MonthManager.class),PendingIntent.FLAG_CANCEL_CURRENT));
        registerAlarmAt(3,0,0);
    }
    private void registerAlarmAt(int hour, int min, int sec){
        timingCal = Calendar.getInstance();
        timingCal.set(Calendar.HOUR_OF_DAY, hour); // At the hour you want to fire the alarm
        timingCal.set(Calendar.MINUTE, min); // alarm minute
        timingCal.set(Calendar.SECOND, sec); // and alarm second
        long intendedTime = timingCal.getTimeInMillis();
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, intendedTime,AlarmManager.INTERVAL_DAY, pendingIntent);
    }
    private void createPendingIntent(){
        Intent alarmIntent = new Intent(this, MonthManager.class);
        alarmIntent.setAction(alarm);
        pendingIntent = PendingIntent.getBroadcast( this, 0, alarmIntent,0 );
    }

Manifest.xml

<application> ...
        <receiver android:name=".MonthManager">
            <intent-filter>
                <action android:name="com.example.aufgaben_planer.alarm"></action>
            </intent-filter>
        </receiver>
</application>

Еще одно примечание, которое может (или не может) быть важным: Я никогда не отменяю регистрацию получателя (не имеет смысла для меня, потому что я объявляю это в Манифесте)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...