0

我是新來的Android的這部分,在這裏我的目標是使用報警管理器運行代碼段每2分鐘將輪詢一個服務器(使用網站的api)返回的JSON會生成通知。 查找網頁後,我認爲在我的情況下最好的選擇之一將使用意向服務和Android。AlarmManager停止從最新的應用程序中刪除應用程序

服務的清單和Recievers

<service 
    android:name=".NotifyService" 
    android:enabled="true" 
    android:exported="false" > 
</service> 
<receiver 
    android:name=".TheReceiver" 
    android:enabled="true" 
    android:exported="true" > 
</receiver> 
<receiver 
    android:name=".OnOffReceiver" 
    android:enabled="true" 
    android:exported="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

在閃屏活動,我所說的目的服務,這是負責輪詢通知部分:

Intent msgIntent = new Intent(this, NotifyService.class); 
    startService(msgIntent); 

的接收器開始報警設備啓動:

public class OnOffReceiver extends BroadcastReceiver 
{ 
    private AlarmManager alarmMgr; 
    private PendingIntent alarmIntent; 
    public OnOffReceiver(){} 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Intent service = new Intent(context, NotifyService.class); 
     service.setAction(NotifyService.CREATE); 
     context.startService(service); 
    } 
} 

IntentService類

public class NotifyService extends IntentService 
{ 
    public NotifyService() 
    { 
     super("NotifyService"); 
    } 
    public static final int STATUS_RUNNING = 0; 
    public static final int STATUS_FINISHED = 1; 
    public static final int STATUS_ERROR = 2; 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     if (intent != null) 
     { 
      final String action = intent.getAction(); 
     } 
     StartStuff(); 
    } 

    public void StartStuff() 
    { 
     Intent intent = new Intent(this, TheReceiver.class); 
     PendingIntent pend_intent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,1200,1200, pend_intent); 
    //1200ms to make it easier to test 
    } 

} 

接收器類設置通知,測試章節目標我沒有做任何與網絡相關的工作,這裏只是做一個簡單的通知,檢查,如果應用程序在所有的情況下運行

public class TheReceiver extends BroadcastReceiver 
{ 
    public TheReceiver(){} 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Toast.makeText(context, " Success ", Toast.LENGTH_SHORT).show(); 
     Log.d("Notification", "The Receiver Successful"); 
     showNotification(context); 

    } 
    private void showNotification(Context context) 
    {   
     NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context).setContentTitle("My notification").setContentText("Hello World!"); 
     mBuilder.setDefaults(Notification.DEFAULT_SOUND); 
     mBuilder.setAutoCancel(true); 
     NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(1, mBuilder.build()); 

    } 
} 

然而,只有當應用程序正在運行或在最近的應用程序托盤中才會發出通知。 手機重新啓動時不會開始通知,也不會在應用程序從最近的應用程序托盤中移除後通知。

應用程序需要像其他應用程序(如gmail,whatsapp)一樣通知用戶,即使它們已從最近的應用程序托盤中移除。 及時性和準時性不是很大的問題,因爲延遲時間可達5到10分鐘。 (儘管我打算進行2分鐘的輪詢)。

我哪裏錯了?另外,是否有更好的方法去解決這個問題?

回答

3

爲了保持在接收機活躍在關閉應用程序後使用

android:process=":remote" 

在清單文件需要被更讓接收器。

<receiver 
     android:name=".TheAlarmReceiver" 
     android:process=":remote"> 
</receiver> 

在清單中的接收器(TheReceiver在這種情況下),我們需要在應用程序關閉後繼續保持活躍。

P.S. :我還改變了我爲應用程序使用IntentsService和AlarmManager的方式,因爲我以前的(上述)實現不是一個很好的解決方法。

+0

現在工作嗎?如果你刷掉應用程序,你的廣播接收器會被叫嗎? –

+0

是的。在當前的實現中,FlashScreen設置警報。然後(在每次警報啓動後),廣播接收器(onReceive)執行IntentService,剩下的所有工作都在那裏完成。即使應用程序從最近的應用程序中刪除,或者設備正在休眠,仍然繼續使用意向服務的所有日誌。 – sky

+0

這不適用於我的情況。我已遵循所有步驟。

1

如果一個應用程序從最近的應用程序中死亡或從「強行停止」它不會重新啓動。用戶必須再次啓動該應用程序才能使其再次運行。沒有辦法阻止這一點。這只是Android的工作方式。

但是有一種方法可以使您的應用程序運行或啓動。退房this link.

+0

但是那麼應用程序如gmail或天氣應用程序如何執行相同的功能?引導鏈接也沒有給出預期的結果。我應該嘗試一種不同的方法嗎? – sky

+0

他們不執行相同的功能。嘗試從最近的應用程序列表中刪除WhatsApp。如果不重新啓動應用程序或重新啓動手機,您將看到不會收到消息。引導鏈接應該工作。 –

+0

如果一個粘滯的'Service'正在運行,當用戶將其應用程序從最近點劃掉時,它將被終止,但幾秒鐘後它將重新啓動。 (無論如何,在KitKat上。) –

相關問題