2016-10-11 5 views
1

У меня есть уведомление в приложении, чтобы показывать пользователям в определенное время, но ничего не отображается, когда приложение закрыто.AlarmManager не запускается, когда приложение закрыто.

Установка сигнализации:

Intent alarmIntent = new Intent(mMotherActivity, ReminderAlarmManager.class); 

if (ReminderNotificationType.CHANGE_LENS.equals(notificationType)) { 
    alarmIntent.putExtra("NOTIFICATION_TYPE", "REMINDER"); 
} else { 
    alarmIntent.putExtra("NOTIFICATION_TYPE", "ORDER"); 
} 

long scTime = alarmDate.getTime(); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(mMotherActivity, 0, alarmIntent, 0); 
AlarmManager alarmManager = (AlarmManager) mMotherActivity.getSystemService(mMotherActivity.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, scTime, pendingIntent); 

радиовещательный приемник:

public class ReminderAlarmManager extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String notificationType = intent.getStringExtra("NOTIFICATION_TYPE"); 
     if(notificationType.equalsIgnoreCase("ORDER")) 
     { 
      Intent i = new Intent(context, OrderReminderNotificationService.class); 
      context.startService(i); 
     } 
     else if(notificationType.equalsIgnoreCase("REMINDER")) 
     { 
      Intent i = new Intent(context, ReminderNotificationService.class); 
      context.startService(i); 
     } 
    } 
} 

Так что, когда дело доходит до scTime, даже если приложение закрыто, я хотел бы, чтобы вызвать уведомления. Так что я звоню сервис с помощью PendingIntent следующим образом:

public class OrderReminderNotificationService extends IntentService { 

    public OrderReminderNotificationService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 

     Context context = getApplicationContext(); 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      context); 

     Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     mBuilder.setContentTitle("Notification"); 
     mBuilder.setContentText(context.getString(R.string.renewOrderNotificationMsg)); 
     mBuilder.setSmallIcon(R.mipmap.ic_launcher); 
     mBuilder.setSound(uri); 
     mBuilder.setAutoCancel(true); 

     Intent notificationIntent = new Intent(this, LoginActivity.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
     mBuilder.setContentIntent(contentIntent); 
     mNotificationManager.notify(2, mBuilder.build()); 
} 

части, в манифесте по поводу того:

<receiver android:name="com.company.utils.ReminderAlarmManager"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

Но ничего не отображается ... Что я делаю не так?

+0

Вы звоните в службу «BroadcastReceiver»? – Marat

+0

Я редактировал свой пост с полным кодом. Я отправил BroadCastreceiver и выполнил настройку AlarmManager. Должен ли я что-то делать в манифесте на BOOT_COMPLETED, что-то вроде этого? –

+0

Ваш файл манифеста тоже необходим. Я имею в виду, зарегистрировали ли вы свой «трансляционный приемник» и «сервис» в манифесте? – Marat

ответ

2

Ваш AndroidManifest.xml должно быть так:

<receiver android:name=".ReminderAlarmManager"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

<service android:name=".OrderReminderNotificationService "/> 
+1

Просто еще один вопрос. Скажем, чтобы выполнить приемник на BOOT_COMPLETED, я понимаю, что он будет запущен, когда девайдер загрузится. Но я хотел бы запустить будильник в определенное время, отправленное диспетчеру аварийной сигнализации, даже если приложение закрыто? Это должно работать так? –

+0

Все тревоги удаляются, когда телефон выключен. Поэтому у нас есть действие «BOOT_COMPLETED», которое система отправляет всем получателям, имеющим его в своем intenr-фильтре. Так мы знаем, что система была перезагружена, и нам нужно сбросить аварийные сигналы. Однако, если вы не заботитесь об удалении аварийных сигналов после перезагрузки, вам не нужен фильтр намерений с 'BOOT_COMPLETED'. Ваши тревоги будут запущены, даже если приложение было закрыто – Marat

0

менеджер Сигнал не вызывает Намерение услуги на некоторых телефонах. Я тестировал приложение на Oneplus 3T весь день, прежде чем понял, что с кодом ничего не случилось. Просто протестировал одно и то же приложение на Moto G, и оно работает так, как ожидалось.

Смежные вопросы