AlarmManager не работает будильник если выйти из приложения

У меня есть приложение будильник. Когда я создаю будильник то оно работает хорошо (Если не выходить из приложения), а если выйти - то будильник не срабатывает. Вот мой код:

AlarmFragment (С которого устанавливается будильник):

package org.vitaliy.numbell.Fragments;

public class AlarmFragment extends Fragment {

ArrayList<String> times = new ArrayList<>();
ArrayList<String> descriptions = new ArrayList<>();

Button home_btn;
RecyclerView alarmRecyclerView;
ImageButton add_btn;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_alarm, container, false);

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

    home_btn = view.findViewById(R.id.home_btn);
    alarmRecyclerView = view.findViewById(R.id.alarmRecyclerView);
    add_btn = view.findViewById(R.id.add_btn);

    times.clear();
    descriptions.clear();

    times.add("09:00");
    descriptions.add("Будильник, Без повтора");
    times.add("09:11");
    descriptions.add("Будильник, Без повтора");
    times.add("09:11");
    descriptions.add("Будильник, Без повтора");

    alarmRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    AlarmAdapter adapter = new AlarmAdapter(getActivity(),times,descriptions);
    alarmRecyclerView.setAdapter(adapter);

    home_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AppActivity.fragment = new SearchFragment();
            AppActivity.bottom_nav.setSelectedItemId(R.id.search);
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frame,AppActivity.fragment).commit();
        }
    });

    add_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar cur_time = Calendar.getInstance();
            MaterialTimePicker materialTimePicker = new MaterialTimePicker.Builder()
                    .setTimeFormat(TimeFormat.CLOCK_24H)
                    .setHour(cur_time.get(Calendar.HOUR_OF_DAY))
                    .setMinute(cur_time.get(Calendar.MINUTE))
                    .build();

            materialTimePicker.addOnPositiveButtonClickListener(new View.OnClickListener() {
                @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void onClick(View view) {
                    Calendar calendar = Calendar.getInstance();
                    calendar.set(Calendar.SECOND, 0);
                    calendar.set(Calendar.MILLISECOND, 0);
                    calendar.set(Calendar.MINUTE, materialTimePicker.getMinute());
                    calendar.set(Calendar.HOUR_OF_DAY, materialTimePicker.getHour());

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

                    Toast.makeText(getActivity(), "Будильник установлен на " + simpleDateFormat.format(calendar.getTime()), Toast.LENGTH_SHORT).show();

                }
            });

            materialTimePicker.show(getActivity().getSupportFragmentManager(),"tag_picker");

        }
    });

    return view;
}

private PendingIntent getAlarmInfoPendingIntent() {
    Intent alarmInfoIntent = new Intent(getActivity(), StartActivity.class);
    alarmInfoIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    return PendingIntent.getActivity(getActivity(),0,alarmInfoIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}

private PendingIntent getAlarmActionPendingIntent() {
    Intent intent = new Intent(getActivity(), AlarmActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    return PendingIntent.getActivity(getActivity(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

}

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.vitaliy.numbell">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.SET_ALARM" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.Numbell">

    <activity android:name=".AlarmActivity" />

    <receiver
        android:name=".Widget"
        android:exported="true">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_info" />
    </receiver>

    <activity
        android:name=".AppActivity"
        android:configChanges="colorMode|keyboardHidden|screenSize|orientation|locale"
        android:exported="false"
        android:screenOrientation="portrait" />
    <activity
        android:name=".StartActivity"
        android:configChanges="colorMode|keyboardHidden|screenSize|orientation|locale"
        android:exported="true"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

AlarmActivity (Активность которая открывается когда срабатывает будильник):

package org.vitaliy.numbell;

public class AlarmActivity extends AppCompatActivity {

Ringtone ringtone;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alarm);
    WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

    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);
    }
    if(ringtone != null){
        ringtone.play();
    }
}

@Override
protected void onDestroy() {
    if(ringtone != null && ringtone.isPlaying()){
        ringtone.stop();
    }
    super.onDestroy();
}

}


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

Автор решения: Андрей Тахтеев

Столкнулся с такой же проблемой.

Для того, чтобы будильник воспроизвелся, требуется фоновая задача, а некоторые модели телефонов, хуавей, самсунг и xiaomi, убивают все фоновые процессы при выходе из приложения или спустя полчаса. При этом пользователю не дают возможность изменять настройки. Проблема эта длится уже с 2018 года Google не может решить эту проблему до сих пор.

https://issuetracker.google.com/issues/122098785

Даже сайт создали по этой проблеме: https://dontkillmyapp.com/

Убиство задач на пуш-уведомления, например, можно обойти через Huawei Push Kit.

→ Ссылка