簡體   English   中英

將Intent Service與Alarm Manager結合使用

[英]Using Intent Service in combination with Alarm Manager

我已經使用了警報管理器來允許用戶安排特定任務在特定時間重復執行。 在該應用程序的上下文中,我有一個Android游戲,人們可以在該游戲中安排發送船的時間。 警報管理器工作正常,警報在適當的時間啟動等。

發出警報時(通常每隔一個小時便會發出一次),我的IntentService將開始與服務器通信以發送船只。 此操作可能需要1分鍾,但最多可能需要10分鍾。 即使這一切都很好。 警報被觸發,船舶被發送,每個人都很高興。 問題出現在晚上,我入睡並且希望醒來時我的船已經整夜被送出。 不。 日志和通知顯示警報已正確觸發,但IntentService與服務器通信時似乎被殺死。

造成這種情況的可能原因是,我並不是像清醒時那樣不時看游戲,因此會保持某種形式的進程運行,從而防止IntentService被垃圾回收。

我已經嘗試了很多方法來解決此問題。 我曾經使用BroadCastReceiver曾經IntentService中生成ASyncTasks ,但是此后我重構了代碼以不再使用這些東西,因為它們對服務來說是不好的做法。

我還檢查了以下資源: http : //techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html,但是我仍然不確定我在做什么是否正確處理這種情況。 我為第二天晚上放置了一些日志記錄,供早晨查看,但是我希望你們對此有意見。

哦,我還要求使用onHandleIntent函數的完整持續時間來使用WakeLock

PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE);                                         
this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "MyApplicationWakeLock");

我的IntentService:

public class ScheduledRequestService extends IntentService {

    public ScheduledRequestService() {
        super("ScheduledRequestService");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startID){
        Logger.d("OnStartCommand!");
        return super.onStartCommand(intent, flags, startID);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ScheduledRequest request = (ScheduledRequest) intent.getExtras().getSerializable("request");
        // This function will start a lot of client <-> server communication
        request.onExecute(this, intent);
    }

    @Override
    public void onDestroy(){
        Logger.d("OnDestroy!");
        super.onDestroy();
    }
}

同樣,我的問題是; 我是否正確構造了這個結構? 我應該使用普通服務而不是IntentService嗎? 我的IntentService處理Intent時能否將其收集為垃圾(我想我讀到這是可能的)?

我的IntentService處理Intent時能否將其收集為垃圾(我想我讀到這是可能的)?

否,但是您的過程可以終止。

我是否正確構造了這個結構?

如果您嘗試使用_WAKEUP警報,則_WAKEUP 在這種情況下,您需要更仔細地進行設置,我建議您使用WakefulBroadcastReceiverWakefulIntentService來處理該模式。

我應該使用普通服務而不是IntentService嗎?

不,可以使用IntentService 您可能需要考慮使用startForeground()使其成為前台服務。

原來錯誤是在Android的垃圾收集器之外的其他地方。 我使用的是高速緩存,最終導致我“船只用完了”,因為在發送時間,它從池中扣除了已發送的船只數量。 但是,當它們返回時,它們永遠不會被添加回緩存中。 白天,我可能手動刷新了緩存,或者強迫Android使用我的手機清除了緩存,否則並沒有引起問題的發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM