Вызов активити по времени, когда приложение закрыто

Делаю будильник на андроид. Сейчас встала задача, что когда приложение свёрнуто, или закрыто, будильник не играет. Когда наступает заданное время, лишь войдя в приложение, будет выведена активити экрана будильника.

Насколько я понял, нужно использовать Сервис, для работы в фоне. Но как его реализовать, я все никак не пойму.

Мой MainActivity.java

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    Button button;
    private String hourString, minuteString;

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

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());

        recyclerView = findViewById(R.id.list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);


        button = findViewById(R.id.button);
        button.setOnClickListener(view -> {
            MaterialTimePicker timePicker = new MaterialTimePicker.Builder()
                    .setTimeFormat(TimeFormat.CLOCK_24H)
                    .setHour(12)
                    .setMinute(0)
                    .build();


            timePicker.addOnPositiveButtonClickListener(view1 -> {
               Calendar calendar = Calendar.getInstance();
               calendar.set(Calendar.SECOND, 0);
               calendar.set(Calendar.MILLISECOND, 0);
               calendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour());
               calendar.set(Calendar.MINUTE, timePicker.getMinute());


               hourString = String.valueOf(timePicker.getHour());
               minuteString = String.valueOf(timePicker.getMinute());


               AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
               AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), getAlarmInfoPendingIntent());
               alarmManager.setAlarmClock(alarmClockInfo, getAlarmActionPendingIntent(hourString, minuteString));


               Toast.makeText(this, " Alarm set on " + sdf.format(calendar.getTime()), Toast.LENGTH_SHORT).show();
            });

            timePicker.show(getSupportFragmentManager(), "tag_picker");
        });
    }

    private PendingIntent getAlarmInfoPendingIntent() {
        Intent alarmInfoIntent = new Intent(this, MainActivity.class);
        alarmInfoIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

        return PendingIntent.getActivity(this, 0, alarmInfoIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
    }

    private PendingIntent getAlarmActionPendingIntent(String hourString, String minuteString) {
        Intent intent = new Intent(this, AlarmActivity.class);

        intent.putExtra("hourString", hourString);
        intent.putExtra("minuteString", minuteString);

        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

        return PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
    }
    

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }
}

AlarmActivity.java

public class AlarmActivity extends AppCompatActivity {

    Button stopAlarm;
    TextView timeString;
    Ringtone ringtone;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);

        // Searching and setting device default alarm ringtone
        // as app ringtone
        Uri notificationUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        ringtone = RingtoneManager.getRingtone(this, notificationUri);
        if (ringtone == null) {
            notificationUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            ringtone = RingtoneManager.getRingtone(this, notificationUri);
        } else
            ringtone.play();


        String hourString;
        String minuteString;
        // Getting hour and string info in string from MainActivity
        // using intent
        Bundle hourMinuteData = getIntent().getExtras();
        hourString = hourMinuteData.getString("hourString");
        minuteString = hourMinuteData.getString("minuteString");


        // Formatting time strings 1:5 -> 01:05
        if (Integer.parseInt(hourString) < 10) {
            hourString = hourString.substring(-1, -1) + "0" + hourString;
        }
        if (Integer.parseInt(minuteString) < 10) {
            minuteString = minuteString.substring(-1, -1) + "0" + minuteString;
        }


        // Setting time data on TextView
        String timeData = hourString + " : " + minuteString;
        timeString = findViewById(R.id.time_string);
        timeString.setText(timeData);


        // Defining button and setting click listener
        // that is stopping ringtone, transfer user to MainActivity and destroying AlarmActivity
        stopAlarm = findViewById(R.id.alarm_stop);
        stopAlarm.setOnClickListener(v -> {
            ringtone.stop();
            Intent intent = new Intent(this, MainActivity.class);
            startActivity(intent);
            finish();
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

Ответы (0 шт):