Настройте AlarmManager на работу даже после закрытия приложения - PullRequest
0 голосов
/ 16 марта 2020

У меня есть задача, которую я хочу выполнить в назначенное пользователем время с помощью 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 медиафайл до его окончания, как это было в прошлом.

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