2011-04-21 59 views
0

我現在正在爲Android編寫電池控件。但問題是,我在我的服務中註冊了兩個BroadcastReceivers。我開始我的AppWidgetProvider的onEnable()方法的服務,並停止onDisable()。該服務旨在監聽電池狀態更新和方向更改,並通過將我的自定義Intent發送到我的AppWidgetProvider來通知widget更新自身。由於廣播(battery_state_changed和configuration_changed)無法由普通AppWidgetProvider接收,並且AppWidgetProvider無法註冊BroadcastReceivers本身。BroadcastReceiver不時在我的服務中工作,爲什麼?

這一切正常工作一兩天。但有時候,當電池狀態發生改變時,小部件並沒有自行更新,似乎我服務中的接收器無法工作,或者定製Intent突然成功停止到達我的AppWidgetProvider。

任何想法爲什麼會發生這種情況?

package com.carllee.widgets.kittenbatterywidget; 

import android.app.Service; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 

public class BatteryStateMoniterService extends Service { 
    private static final String TAG = "BatteryStateMoniterService"; 
    private BatteryStateReceiver batteryStateReceiver; 
    private OrientationChangeReceiver orientationChangeReceiver; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Logger.log(TAG, "onCreate"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (batteryStateReceiver == null) { 
      this.unregisterReceiver(batteryStateReceiver); 
     } 
     if (orientationChangeReceiver == null) { 
      this.unregisterReceiver(orientationChangeReceiver); 
     } 
     Logger.log(TAG, "onDestroy"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (batteryStateReceiver == null) { 
      registerBatteryStateReceiver(); 
     } 

     if (orientationChangeReceiver == null) { 
      registerOrientationChangeReceiver(); 
     } 
     Logger.log(TAG, "onStartCommand"); 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private void registerBatteryStateReceiver() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_BATTERY_CHANGED); 
     filter.addAction(Intent.ACTION_BATTERY_LOW); 
     filter.addAction(Intent.ACTION_BATTERY_OKAY); 
     batteryStateReceiver = new BatteryStateReceiver(); 
     this.registerReceiver(batteryStateReceiver, filter); 
    } 

    private void registerOrientationChangeReceiver() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 
     orientationChangeReceiver = new OrientationChangeReceiver(); 
     this.registerReceiver(orientationChangeReceiver, filter); 
    } 

} 

回答

0

那麼,對於一個聲明:

if (batteryStateReceiver == null) { 
     this.unregisterReceiver(batteryStateReceiver); 
    } 
    if (orientationChangeReceiver == null) { 
     this.unregisterReceiver(orientationChangeReceiver); 
    } 

沒有任何意義。每次你會得到NullPointerException。改變==!=;)

此外,看到的是,在背景長時間(出於需要運行的複雜服務的my post about keeping background services alive.

例)調用startForeground()。但是,它仍然可以被系統或用戶殺死。

+0

是的,謝謝你,但是startForeground()需要一個Notification參數,這會在狀態欄中發出一個通知(如果我沒有記錯的話),應用程序小部件每次都會發出通知沒有任何意義它被添加到啓動器。有沒有更好的解決方案來阻止我的服務被殺?或者我應該只傳遞null來startForeground()?或者有什麼辦法可以阻止狀態欄中顯示通知? – CarlLee 2011-04-22 03:19:48

+1

嗨,我找到了一個解決方案,似乎工作,不知道它是否有效,我還在測試。解決方法是調用「setForeground(true);」 ,這將服務設置爲前臺,而​​不在狀態欄中顯示任何消息。 – CarlLee 2011-04-22 05:41:44

相關問題