У меня есть задача, которую я хочу выполнить в назначенное пользователем время с помощью AlarmManager.
Раньше, когда я хотел воспроизвести звук, его можно было легко решить без каких-либо дополнительных действий, но сейчас, когда я закрываю приложение, Broadcast Receiver воспроизводит медиа-файл в течение 1-2 секунд, а затем останавливает его.
MainActivity:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button submitButton;
EditText editTextHour, editTextMinute;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
submitButton = findViewById(R.id.submitButton);
editTextHour = findViewById(R.id.editTextHour);
editTextMinute = findViewById(R.id.editTextMinute);
submitButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int hour = Integer.parseInt(editTextHour.getText().toString()), minute = Integer.parseInt(editTextMinute.getText().toString());
Utils.setAlarm(this, hour, minute);
}
}
SetAlarm util:
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import java.util.Calendar;
class Utils {
static void setAlarm(Context context, int hour, int minute){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, Receiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
assert alarmManager != null;
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
}
Получатель:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.alarm_sound);
mediaPlayer.start();
}
}
Я хочу знать, существует ли какой-либо конкретный способ заставить приемник не завершать sh медиафайл до его окончания, как это было в прошлом.