2016-06-07 96 views
0

我的應用程序有一個服務,每30秒執行一次特定URL的獲取。該服務使在AndroidManifest.xml配置:我想我的應用程序在後臺運行並未被Android關閉

<receiver 
    android:name="com.analisesistemas.taxiweb.android.alarm.MyAlarmReceiver" 
    android:process=":remote" > 
</receiver> 
<service 
    android:name="com.suporte.motoweb.chegaja.MyTestService" 
    android:exported="false" /> 

服務由我的應用程序啓動時這樣說:

// Setup a recurring alarm every half minute 
public void scheduleAlarm() { 
// Construct an intent that will execute the AlarmReceiver 
Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver.class); 

// Create a PendingIntent to be triggered when the alarm goes off 
final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// Setup periodic alarm every 5 seconds 
long firstMillis = System.currentTimeMillis(); // alarm is set right away 

AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 

// First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP 
// Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY 
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, TIMER, pIntent); 
} 

的方法scheduleAlarm()被調用在我的主要活動的onCreate()。

問題是,當我按Home鍵(以最小化我的應用程序),所以我可以使用其他應用程序,如Facebook和Instagram ...我注意到我的應用程序停止運行(android關閉我的應用程序可能會節省內存)。

真的,我已經嘗試了各種方式,但Android在後臺運行時關閉了我的應用程序。不是馬上,它是幾分鐘後!

我該如何防止我的應用程序被Android操作系統終止?我需要讓它無限期地運行! :(

感謝自從關注

+0

每30秒發出一次GET請求將導致數據使用量過大和電量耗盡,這將導致所有用戶卸載您的應用。詳細說明你正在嘗試解決的問題,我可以給你一個更好的解決方案,以便如何最好地解決它https://developer.android.com/training/efficient-downloads/index.html –

+0

這種行爲可能是ROM的依賴,而不是Android(通常)的依賴。我記得在4.0.1中有一個類似的錯誤,如果我記得正確的話,但是它在很久以前就已經在更高版本中被修復了。 –

回答

0

根據您的要求,而不是粘服務,我會建議你使用GCM Network Manager它採用JobSchedular API的棒棒糖,並針對Android,以及更低的版本上的版本和類似兼容的方式。對於週期性任務會爲你做所有困難的步驟,你可以主要集中在商業邏輯。

PeriodicTask task = new PeriodicTask.Builder() 
     .setService(MyTaskService.class) 
     .setTag(TASK_TAG_PERIODIC) 
     .setPeriod(30L) 
     .build(); 

mGcmNetworkManager.schedule(task); 
0

你可以的onDestroy發送廣播()服務的方法,而當你接收廣播

啓動服務
+0

嗨,我該怎麼做?你有一個例子嗎? – user2725921

+0

對不起,這只是一個想法。但我不認爲這很困難。由於阻止系統停止應用程序很困難,因此可以在應用程序停止時重新啓動。當服務停止時,它必須運行ondestroy(),因此您可以使用ondestroy()方法發送廣播,並在接收停止廣播時註冊啓動服務的廣播接收器 –

0

你認爲每30秒設置一次http請求是個好主意嗎?正如@JustinSlade所提到的,這將導致手機過度使用電池和糟糕的用戶體驗。

此外,目前尚不清楚有什麼不對您當前的機制 - 從先來看看AlarmManager應該觸發BroadcastReceiver,其中,據我瞭解運行Service那裏請求被執行(和,也許,重新安排報警)。那麼,這裏有什麼問題?你沒有收到廣播的意圖嗎?

無論如何,這是非常醜陋的方法,我建議你使用Google Cloud Messaging,並且只有在新數據可用時才通知應用程序。爲了提高申請流程的優先級,您還可以在Service中使用setForeground,但這需要在通知面板中提供UI。

相關問題