AlarmManager не выполняет задачу в определенное время - PullRequest
0 голосов
/ 22 сентября 2018

Я хочу устанавливать обои ежедневно в определенное время, и для этого я использую AlarmManager в Android, чтобы вызвать функцию установки обоев.Вот мой код, в котором я установил Alarm для смены обоев .:

 public void setTime() {
        alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, reciveBrodcast.class);
        alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);


        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 40);


        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);
    }

, и я инициализирую эту функцию в функции onCreate () MainActivity.class:

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTime();
        }

Функция setTimeзапустил reciveBrodcast.class и я вызываю функцию setWallpaper на этом как:

public class reciveBrodcast extends BroadcastReceiver  {
    quotePresenter presenter =new quotePresenter();
    @Override
    public void onReceive(Context context, Intent intent) {

        presenter.downloadTaskIn();

    }

Здесь Presenter это класс, который имеет downloadTaskIn () для установки обоев.Но этот код не работает, и когда я пытаюсь эту функцию с помощью кнопки, то он работает.Пожалуйста, помогите мне, как я могу вызвать это событие в определенное время.

Мой мейнфест:

  <receiver android:name=".View.reciveBrodcast" android:process=":remote" />
       <activity android:name=".View.MainActivity">

1 Ответ

0 голосов
/ 27 сентября 2018

Пожалуйста, попробуйте код ниже.

Помощник Class для установки будильника.

public class AlarmSetter {

    private final String TAG = "AlarmSetter";
    private final int REQUEST_CODE = 9587;
    private Context context;

    public AlarmSetter(Context context) {

        this.context = context;
    }

    public void setAlarm() {

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        if (alarmManager == null) {

            Log.e(TAG, "ALARM_SERVICE was null :(");

            return;
        }

        Intent intent = new Intent(context, BRWallpaperChanger.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, 0);

        cancelPreviousAlarm(alarmManager, pendingIntent);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 40);
        calendar.set(Calendar.SECOND, 0);

        long when;

        if (System.currentTimeMillis() <= calendar.getTimeInMillis()) {

            when = calendar.getTimeInMillis();

        } else {

            when = calendar.getTimeInMillis() + 86400 * 1000; // Add one day in exact time
        }

        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {

            alarmManager.set(AlarmManager.RTC_WAKEUP, when, pendingIntent);

        } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {

            alarmManager.setExact(AlarmManager.RTC_WAKEUP, when, pendingIntent);

        } else {

            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when, pendingIntent);
        }

        Log.d(TAG, "Next trigger set for at " + new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(when));
    }

    private void cancelPreviousAlarm(AlarmManager alarmManager, PendingIntent pendingIntent) {

        alarmManager.cancel(pendingIntent);
    }

}

Теперь в вашем onCreate() из MainActivity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AlarmSetter alarmSetter = new AlarmSetter(context);
    alarmSetter.setAlarm();
}

Ваш BroadcastReceiver для настройки обоев.

public class BRWallpaperChanger extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // Set Alarm for next time...

        AlarmSetter alarmSetter = new AlarmSetter(context);
        alarmSetter.setAlarm();

        // Change wallpaper here...
    }
}

В вашем AndroidMenifest.xml

<receiver
    android:name=".BRWallpaperChanger"
    android:enabled="true"
    android:exported="false" />

Пожалуйста, дайте мне знать, работает код или нет.

...