2012-07-27 57 views
0

我是新來的android編程,所以這些可能是愚蠢的問題。我做了一些閱讀,但不能完全得到答案。服務停止時如何處理意圖?

我有從服務註冊的一些意圖的廣播接收器 -

receiver = new EventHandler(); 
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    filter.addAction(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); // for calls 
    registerReceiver(receiver, filter); 

正如我已經去掉了「setForeground」叫我把讓我的服務運行(因爲我不想要一個狀態欄圖標,我想知道如果我是懶惰的方式),我的服務現在會定期關閉,並通常在不久之後重新啓動(但有時我已經看到它是5分鐘)。

問題 - 由於我以編程方式註冊了我的意圖,如果我的進程恰好處於停止狀態,Android將如何知道發送我感興趣的意圖。我假設我會錯過一些事件。

我試圖把意圖放在清單中,但我已閱讀(並觀察)您無法使用該技術來更換電池的意圖。

謝謝。

回答

0

好吧首先,如果你想保持你的服務還活着,你必須獲得來自PowerManager一個WakeLockonCreate()onDestroy()釋放。

http://developer.android.com/reference/android/os/PowerManager.html

操作系統仍可能破壞,有時重新創建的服務,但你不必擔心它被停止較長時間。 (startForeground()並不保證它要麼,你申請了例如鑰匙鎖後,您會Service活着。)

如果服務被破壞,那麼OS仍然會觸發Intents你是不會看到它們。

+0

「如果你的服務被破壞了,那麼操作系統仍然會激發你只是不會看到它們的意圖「 - 這回答了我的問題。這聽起來像我需要儘可能保持我的服務活着。我不知道喚醒鎖,所以感謝那些信息 - 我會看看。 – 2012-07-27 10:02:23

+0

要小心,加入喚醒鎖會耗盡你的電池:) – Superbiji 2012-07-27 10:08:17

+0

想必它是我需要的「PARTIAL_WAKE_LOCK」?所有其他設置似乎都保留了我當然不想要的屏幕! – 2012-07-27 10:14:32

0

Intent是Android中一種特殊的後期綁定機制。廣播接收者,活動和服務在系統中註冊意圖過濾器,當意圖被激發時,系統激活可以處理這種意圖的組件。因此,如果系統中註冊了意圖過濾器,則將調用您的組件。如果系統中有靜態意圖過濾器(那些在AndroidManifest.xml中聲明的過濾器),則Android OS會在系統啓動時註冊。如果是動態意圖過濾器(在broadcastreceivers的代碼中聲明),則需要在啓動後註冊它們。因此,您可以爲onBoot事件聲明意圖過濾器,並在此廣播接收器中聲明您的動態意圖。

0

關於您的服務被終止並重新啓動,這在android中是正常的,特別是當內存不足時。 ACTION_BATTERY_CHANGED不能放在清單中,但ACTION_SCREEN_ON/OFF可以。 所以,你必須放在一個服務,並確保您的事件接收器運行,投入的onCreate註冊()方法:

public void onCreate() { 
    super.onCreate(); 

    // battery 
    registerReceiver(mBatteryInfoReceiver, new IntentFilter(
     Intent.ACTION_BATTERY_CHANGED)); 
    ... 
} 

public void onDestroy() { 
    super.onDestroy(); 

    unregisterReceiver(mBatteryInfoReceiver); 
} 

,也不要忘記註銷,當你的服務旨在阻止

+0

嗨 - 是的,這是我所做的。我擔心的是,如果當我的服務中斷時電池發生變化,怎麼會收到通知?由於它不在清單中,我猜測Android不會知道我對該通知感興趣。謝謝回覆。彼得。 – 2012-07-27 09:59:17