2

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

И код отлично работает, если приложение открыто или просто в фоновом режиме.

В то время, когда приложение убивается, приемник все еще может срабатывать при выполнении тревоги.

Однако уведомления не показывались.

Что я могу сделать?

Функция сигнала тревоги:

public static void makeAlarm(Context context,Date date) { 
    Log.i("Alarm", "makeAlarm"); 
    AlarmManager alarmMgr; 
    PendingIntent alarmIntent; 
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
    alarmMgr.set(AlarmManager.RTC_WAKEUP, 
      date.getTime(), alarmIntent); 
} 

AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver { 
    public AlarmReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
       Log.i("Alarm", "onReceive"); 
       android.support.v4.app.NotificationCompat.Builder mBuilder = 
         new NotificationCompat.Builder(context) 
           .setSmallIcon(R.drawable.app_logo) 
           .setContentTitle("Title") 
           .setContentText("Message"); 

       Intent resultIntent = new Intent(context, MainActivity.class); 
       TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
       stackBuilder.addParentStack(MainActivity.class); 
       stackBuilder.addNextIntent(resultIntent); 
       PendingIntent resultPendingIntent = 
         stackBuilder.getPendingIntent(
           0, 
           PendingIntent.FLAG_UPDATE_CURRENT 
         ); 
       mBuilder.setContentIntent(resultPendingIntent); 
       NotificationManager mNotificationManager = 
         (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
       Random rand = new Random(); 
       mNotificationManager.notify(rand.nextInt(), mBuilder.build()); 

    } 
} 

Manifest.xml

<receiver 
    android:name=".receiver.AlarmReceiver" 
    android:enabled="true" 
    android:exported="true" /> 
+0

@Seasons: r У уверен, что onReceive() вызывается, когда убьют приложение из фона? – kevz

+0

@kevz Я уверен, что onReceive() запущен, так как я могу видеть журналы – Season

+0

попытаться отправить сообщение внутри onReceive() coz Код уведомления выглядит хорошо. – kevz

ответ

0

При установке сигнализации с помощью -

alarmMgr.set(AlarmManager.RTC_WAKEUP,date.getTime(), alarmIntent); 

Я думаю, что вы date.getTIme() извлекает текущее время. Поэтому, когда будильник пытается выполнить, время срабатывания уже прошло. Лучше, вы можете сделать некоторую задержку (скажем, пять секунд) для запуска вашего будильника. Просто используйте линию -

alarmMgr.set(AlarmManager.RTC_WAKEUP,date.getTime() + 5*1000, alarmIntent); 
+0

нет, это нет текущее время. Время datetime устанавливается в будущем, например, через 10 секунд – Season

1

Пожалуйста, запустите образец кода. Я думаю, что он работает так, как вы хотите.

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    setUpAlarm(10 * 1000); 
} 
public void setUpAlarm(long triggerTimeInMS) { 
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(this, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+triggerTimeInMS , pendingIntent); 
} 
} 

Создать класс приемника -

public class AlarmReceiver extends BroadcastReceiver { 
private String TAG = "AlarmLog"; 

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

    Toast.makeText(context, "Incoming Call Received", Toast.LENGTH_LONG).show(); 

    showNotification(context); 

} 

private void showNotification(Context context) { 
    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.alarm) 
      .setContentTitle("Notification!") // title for notification 
      .setContentText("Alarm Received") 
      .setSound(soundUri)// message for notification 
      .setAutoCancel(true); // clear notification after click 
     NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(0, mBuilder.build()); 
} 
} 

не забудьте зарегистрировать тор приемника. внутри manifest.xml введите код ниже:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name="com.example.shajib.alarmtest.AlarmReceiver" /> 
</application> 

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

  • Нет связанных вопросов^_^