2016-05-06 38 views
0

我想通過定期調用API來發送通知給用戶,以檢查是否有任何未決通知用戶是否正在使用該應用程序。我想在後臺運行該服務24小時。如何通過週期性地從Android後臺服務調用api來發送通知

現在我通過報警管理

這裏做任務是代碼:

服務:

public class NotificationService extends IntentService { 

    public NotificationService() { 

     super("NotificationService"); 

    } 

    @Override 

    protected void onHandleIntent(Intent intent) { 

     //call api 

     sendNotification(); 

    } 
    private void sendNotification() { 

     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.ic_launcher) 
         .setContentTitle("Hello") 
         .setContentText("Hello World") 
         .setAutoCancel(true); 
     Intent resultIntent = new Intent(this, MainActivity.class); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(MainActivity.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(1, mBuilder.build()); 
     playNotificationSound(); 

    } 
} 

接收機

public class NotificationServiceReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent dailyUpdater = new Intent(context, NotificationService.class); 

     context.startService(dailyUpdater); 
    } 
} 

AlarmManager

private void setRecurringAlarm(Context context) { 

     Calendar updateTime = Calendar.getInstance(); 
     updateTime.setTimeZone(TimeZone.getDefault()); 
     Intent downloader = new Intent(context, NotificationServiceReceiver.class); 
     downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123546, downloader, PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), REPEAT_TIME, pendingIntent); 


    } 

的問題是,報警管理器沒有工作,有時,當我再次啓動應用程序,然後它的統計工作。

+0

您是否考慮過使用來自服務器的推送通知,而不是輪詢來自客戶端的通知? –

+0

還沒有..我們需要根據用戶登錄憑證提取通知。 – KousiK

+0

如何確保您的鬧鐘管理器不工作?可能是您的接收器沒有運行service.Please檢查此。 – Rama

回答

0

問題是您的BroadcastReceiver保證運行,但不是Service由於省電。您需要使用喚醒鎖(請參閱WakefulReceiver上的文檔)以確保您的Service有機會運行。本文將幫助您:http://hiqes.com/android-alarm-ins-outs/

請注意,新的打盹模式也會影響到這一點。

+0

可以發表一些代碼示例@Larry – KousiK

+0

查看文章。 :-)它提供了有關警報的詳細信息,並且還有示例代碼的github回購。示例代碼啓動一個「活動」而不是「服務」,但同樣的原則適用。它還在'Application'級別使用靜態喚醒鎖而不是使用喚醒接收器。兩者都是有效的,儘管Android Studio會抱怨說直接使用wakelock已經被棄用了(你可以忽略它 - 它被折磨但可以使用) –

+1

讓'NotificationServiceReceiver'擴展'WakefulBroadcastReceiver'並啓動服務,例如:'startWakefulService (上下文,dailyUpdater)'。當工作完成時,不要忘記通過調用'NotificationServiceReceiver.completeWakefuIntent(intent)'(在Service類中)來釋放喚醒鎖。 – momo

相關問題