Я работаю над приложением тревоги. В этом я использую приемник вещания и менеджер тревог. Когда срабатывает сигнализация, вызывается метод onReceive, а затем из метода onReceive я вызываю startActivity для запуска намерения
НО проблема, с которой я сталкиваюсь, заключается в том, что в некоторых устройствах активность не начинается, когда приложение в фоновом режиме или убито.
В методе onReceive у меня есть три вещи:
- Toast
- RingtoneManager
- Intent
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "In broadcast receiver", Toast.LENGTH_LONG).show();
Bundle args = intent.getBundleExtra(Constants.BROADCAST_RECEIVER_BUNDLE);
Alarms alarms = (Alarms) args.getSerializable(Constants.ALARM_OBJECT);
int alarmRequestCode = args.getInt(Constants.ALARM_REQUEST_CODE);
Intent OpenAppIntent = new Intent();
// I also tried with adding classes in intent object directly eg new Intent(context, MyActivity.class) but no luck
OpenAppIntent.setClass(context,com.example.MyActivity.class);
OpenAppIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
OpenAppIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , args);
context.startActivity(OpenAppIntent);
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
}
Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
ringtone.play();
}
Теперь у нас есть два случая
- Когда у нас есть все три элемента в методе onReceive (тост, менеджер рингтонов и намерение) - тогда тост и рингтон воспроизводятся и отображаются соответственно и активность не начинается
- Когда мы удаляем менеджер рингтонов из метода onReceive (тост и намерение) - тогда Toast также не отображается (активность также не запускается)
Устройства, в которых замечена эта проблема: Gionee F9, Motorola g5s и Redmi k20 pro. Кроме того, иногда то же самое происходит с Nokia 7 Plus
Пожалуйста, скажите мне, что не так с кодом или как лучше всего начать работу при получении трансляции.
Тест 1
Вместо того, чтобы начинать деятельность, я попытался отобразить полноэкранное уведомление, как показано здесь и как предложено в комментарии, но не смог сделать это из-за ошибки Non-stati c метод startForeground (int, Notification) не может быть вызван из состояния c контекста
@Override
public void onReceive(Context context, Intent intent) {
Intent notificationIntent = new Intent(context, MyActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.ALARM_OBJECT , alarms);
notificationIntent.putExtra(Constants.BROADCAST_RECEIVER_BUNDLE , bundle);
PendingIntent pendingIntent = PendingIntent.getActivity(context,
0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
.setContentTitle(Constants.APP_NAME)
.setContentText("Stop the alarm")
.setSmallIcon(R.drawable.logo_inner)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setFullScreenIntent(pendingIntent, true)
.build();
Service.startForeground(1, notification); // Non-static method startForeground(int, notification) cannot be referenced from a static context
}
теста 2
Я также попытался запустить обслуживание переднего плана непосредственно из метода onReceive, но возникает та же проблема, что и при запуске операции. Я также попытался отладить, установив точки останова на методе обслуживания onCreate, но onCreate никогда не вызывал эти устройства (Gionee F9, Motorola g5s и Redmi k20 pro)
@Override
public void onReceive(Context context, Intent intent) {
Intent alarmServiceIntent = new Intent(context, AlarmSoundService.class);
Bundle alarmServiceBundle = new Bundle();
alarmServiceBundle.putSerializable(Constants.ALARM_OBJECT , alarms );
alarmServiceIntent.putExtra(Constants.ALARM_BUNDLE , alarmServiceBundle);
// startService(alarmServiceIntent);
ContextCompat.startForegroundService(context, alarmServiceIntent);
}
Будут благодарны за любые предложения.
Спасибо