Вызов активити по времени, когда приложение закрыто
Делаю будильник на андроид. Сейчас встала задача, что когда приложение свёрнуто, или закрыто, будильник не играет. Когда наступает заданное время, лишь войдя в приложение, будет выведена активити экрана будильника.
Насколько я понял, нужно использовать Сервис, для работы в фоне. Но как его реализовать, я все никак не пойму.
Мой 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();
}
}