6

В моем файле манифеста я объявил получателя. (Следующим образом)BroadcastReceiver не работает, когда приложение не работает

<receiver android:name=".OnAlarmReceive" /> 

однако после того, как я закрыл мое заявление, я не в состоянии получить сигналы тревоги и уведомления. По-видимому, вызов OnReceive в моем Broadcast receiver никогда не был выполнен.

public class OnAlarmReceive extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent arg1) 
    { 
     //various stuff 
    } 
} 

Внутри MainActivity мой класс диспетчера аварийных сигналов приведен ниже.

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent("MY_ALARM_NOTIFICATION"); 
    intent.setClass(this, OnAlarmReceive.class); 
    intent.putExtra("message", message); 
    PendingIntent pendingIntent = PendingIntent 
      .getBroadcast(MainActivity.this, 0, intent, 
        PendingIntent.FLAG_UPDATE_CURRENT); 

    Calendar timeCal = Calendar.getInstance(); 
    timeCal.set(Calendar.HOUR_OF_DAY, hour); 
    timeCal.set(Calendar.MINUTE, minutes); 

    alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), pendingIntent); 

и мой манифест как следует:

<receiver android:name=".OnAlarmReceive"> 
    <intent-filter android:priority="1"> 
     <action android:name="MY_ALARM_NOTIFICATION"/> 
    </intent-filter> 
</receiver> 

Что я должен сделать для того, чтобы получать уведомления/тревоги, даже если я отключить мое приложение. Фоновая служба?

ответ

0

вы должны добавить намерения фильтр в манифесте, так как

receiver android:name=".SmsBroadCastReceiver"> 
     <intent-filter android:priority="20"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
    </receiver> 
+1

Это то же самое для получения сигнала тревоги? потому что вы дали для sms – tony9099

0

Как говорит Гонг Конг, вы должны объявить, какие события приемник должен слушать.

Например:

<receiver android:name=".OnAlarmReceive"> 

<intent-filter> 
    <action android:name="MY_ALARM_NOTIFICATION"/> 
</intent-filter> </receiver> 

, а затем, когда ваш набор ваши тревоги, использовать намерение с действием:

Intent intent = new Intent("MY_ALARM_NOTIFICATION"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); 
+0

Я сделал это. Однако, как только я отключу свою активность, будильник не погаснет. с приложением, выполняющим код выше (даже после моих изменений). но в тот момент, когда я удаляю приложение (из диспетчера задач), он не запускается. – tony9099

+0

Можете ли вы разместить часть своего кода? Как настроить будильник? Используете ли вы флаг AlarmManager.RTC_WAKEUP? –

+0

Да, я так понимаю, я не могу добавить лишние с намерением, поскольку я не называю деятельность с намерением, а вещательный приемник в манифесте нет? – tony9099

0

Ваш код работает отлично!

Все, что вам нужно сделать, это изменить эту строку:

alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), 
pendingIntent); 

С этой линией:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
SystemClock.elapsedRealtime() + 5000, pendingIntent); 

И код в «OnReceive» будет работать после 5000 мс (5с), даже если приложение не работает

-1

1.Declare приемник в Manifest-файле:

<receiver android:name="your.package.name.TestAlarmReceiver"></receiver> 

Всегда помните, что вся Android-система чувствительна к регистру. Поэтому проверьте правильность написания в AndroidMainfest.xml.

2.Если вы создаете PendingIntent для своего Получателя, добавьте requestCode - даже это случайное число! Без вашего onReceive код никогда не вызывается!

Функция, которая начать AlarmManager должна выглядеть следующим образом:

public static void scheduleTestAlarmReceiver(Context context) { 
    Intent receiverIntent = new Intent(context, TestAlarmReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(context, 123456789, receiverIntent, 0); 

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+startDelay, someDelay, sender); 
} 

класс BroadcastReceiver:

package your.package.name; 

public class TestAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
    // your code here! 
    } 
} 

Оригинал статьи: Why my BroadcastReceiver does not get called?

0

В моем понимании, в некоторых обсаженных в зависимости от способ реализации, ОС имеет право корректировать установленное время будильника. Поэтому попробуйте использовать AlarmManager.set (...), AlarmManager.setexact (...) и т. Д. Соответственно. В некоторых случаях, в зависимости от производителя (пользовательская ОС Android), существует вероятность того, что ОС блокирует пожарную тревогу.

0

Добавление android:exported="true" для приемника в файле манифеста помогло мне получить сигналы тревоги (и, таким образом, пробудить приложение), даже когда приложение было отключено (умышленно со мной, удалив приложение из списка задач).