2013-05-07 95 views
1

我正在研究一個應用程序,它會通知我(通過播放鈴聲)電池電量已達到特定級別。級別是可配置的。爲此,我創建了一個啓動服務的活動,該服務又將一個接收器註冊爲ACTION_BATTERY_CHANGED。 MyActivity - >爲MyService - > MyBrodcastReceiver [ACTION_BATTERY_CHANGED] - >的onReceive() - >如果(電池電量< = myvalue的) - >播放鈴聲當屏幕/ CPU關閉時,不會調用Broadcast Receiver onReceive方法

一切工作正常,只要屏幕上,但一旦手機被鎖定屏幕熄滅或cpu睡眠廣播接收器的onReceive方法不會被調用,當我再次解鎖手機時,一切正常。我用日誌記錄驗證了這一點

是否僅當手機屏幕打開時纔會調用ACTION_BATTERY_CHANGED的onReceive方法,並在電話睡眠時停止?

我甚至在的onReceive方法使用喚醒鎖嘗試,但沒有奏效

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


public class BatteryMeterService extends Service { 

    private BatteryStatusReceiver batteryStatusReceiver; 

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

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     batteryStatusReceiver = new BatteryStatusReceiver(null); 
     registerReceiver(batteryStatusReceiver, intentFilter);  
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(batteryStatusReceiver); 
    } 

} 


import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.BatteryManager; 
import android.os.PowerManager; 
import android.preference.PreferenceManager; 
import android.provider.Settings; 
import android.util.Log; 
import android.widget.TextView; 

import com.amol.bm.BatteryMeterUtility.NotificationInfo; 

public class BatteryStatusReceiver extends BroadcastReceiver { 


    private BatteryMeterUtility batteryMeterUtility; 

    public BatteryStatusReceiver() { 
     super(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 


     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
     int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
     float fPct = (level/(float)scale) * 100; 
     int levelPct = (int)fPct; 

     boolean prefAlertLowBattery = sharedPrefs.getBoolean("prefAlertLowBattery", true); 
     if(prefAlertLowBattery) { 
       String prefAlertLowBatteryValue = sharedPrefs.getString("prefAlertLowBatteryValue", "20"); 
       int lowBatteryValue = Integer.parseInt(prefAlertLowBatteryValue); 
       if(levelPct <= lowBatteryValue && iStatus != BatteryManager.BATTERY_STATUS_CHARGING) { 
       notificationInfo.icon = R.drawable.low_battery; 
       PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
       PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BM WakeLook"); 
       wakeLock.acquire(); 
       batteryMeterUtility.playAlertRingtone(alertRingtone); 
       wakeLock.release(); 
       } 
     } 
    } 

} 
+0

您可以在清單和檢查中定義WAKE_LOCK的權限。 – user1721904 2013-05-07 05:10:18

+0

您是否在代碼中的任何地方註銷接收器?可能在onPause? – user1721904 2013-05-07 05:27:20

+0

不是在onPause中,而是在服務的OnDestroy中,但我通過日誌檢查了服務的onDestroy沒有被調用。 – 2013-05-07 05:35:10

回答

0

你應該給WAKE_LOCK權限[我與ICS(4.0.4)測試]你服務在後臺運行,即使手機處於空閒或關機狀態,您的服務仍可繼續運行。希望你知道,如果不清楚

+0

我沒有得到允許服務的意思。我已在清單文件中爲WAKE_LOCK添加了用戶權限。另外,我認爲即使屏幕關閉,我的服務仍在運行。 – 2013-05-07 05:23:57

+0

你可以顯示你的代碼,即服務和廣播接收機 – 2013-05-07 05:25:43

+0

當然。但目前我出去了。我會盡快在家裏發佈代碼。但要給你的想法 - 在服務onCreate()方法我正在註冊一個廣播監聽器,並在onDestroy取消註冊它。在onReceive方法的廣播接收機中,我正在檢查電池電量並使用mediaplayer播放鈴聲。反正會發布代碼。 – 2013-05-07 05:33:45

相關問題