0

我試圖使用AlarmManager在當天晚些時候向用戶發送通知,無論他是否正在使用該應用程序。 我基本上粘貼了我在這裏看到的:http://developer.android.com/guide/topics/ui/notifiers/notifications.html,但顯然出現了一些問題,因爲不是顯示通知,而是顯示AndroidLauncher活動。立即顯示活動而不是顯示通知

這裏是我的代碼:

public void planNotification() { 
     AlarmManager am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 

     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.icon) 
       .setContentTitle("My notification") 
       .setContentText("Hello World!"); 

     Intent resultIntent = new Intent(this, AndroidLauncher.class); 

     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(AndroidLauncher.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = 
       stackBuilder.getPendingIntent(
        0, 
        PendingIntent.FLAG_UPDATE_CURRENT 
       ); 
     mBuilder.setContentIntent(resultPendingIntent); 

     int currentApiVersion = android.os.Build.VERSION.SDK_INT; 

     if (currentApiVersion >= 19) 
      am.setWindow(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, 5000, resultPendingIntent); 
     else 
      am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 86400000, resultPendingIntent); 
    } 

我還是新來的意圖和PendingIntents,所以它可能是一個愚蠢的錯誤。

~~~ ~~~編輯:謝謝你的幫助!現在我知道我需要一個BroadcastReceiver,但我無法使它工作。它看起來像onReceive()永遠不會被稱爲

這是我的主要活動:

@Override 
    public void planNotification() { 
     AlarmManager am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 

     Intent intent = new Intent(this, AlarmReceiver.class); 
     PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     int currentApiVersion = android.os.Build.VERSION.SDK_INT; 

     if (currentApiVersion >= 19) 
      am.setWindow(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, 5000, alarmIntent); 
     else 
      am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, alarmIntent); 
    } 

我的廣播接收器:

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     System.out.println("ON RECEIVE"); 

     NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.icon) 
      .setContentTitle("My notification") 
      .setContentText("Hello World!"); 

     Intent resultIntent = new Intent(context, AndroidLauncher.class); 

     TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
     stackBuilder.addParentStack(AndroidLauncher.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
       0, 
       PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(AndroidLauncher.notifId, mBuilder.build()); 
    } 
} 

回答

1

你有它的方式,報警管理器直接使用resultIntent

你應該將你的通知創建代碼爲BroadcastReceiver

public class AlarmReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.icon) 
      .setContentTitle("My notification") 
      .setContentText("Hello World!"); 

     Intent resultIntent = new Intent(this, AndroidLauncher.class); 

     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(AndroidLauncher.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
       0, 
       PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager mNotificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(mId, mBuilder.build()); 
    } 
} 

,並使用AlarmManager調用BroadcastReceiver

Intent intent = new Intent(this, AlarmReceiver.class); 
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
if (currentApiVersion >= 19) 
    am.setWindow(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, 5000, alarmIntent); 
else 
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 86400000, alarmIntent); 
+0

謝謝你很大的幫助!不幸的是,它仍然無法按預期工作。 'onReceive()'永遠不會被調用。我編輯了我的帖子,以便您可以看到我的代碼。 – Baguette

+0

Android系統將調用的所有組件都需要在清單中註冊:' />' – tachyonflux