2012-09-30 119 views
2

我建立一个简单的应用程序,具有BroadcastReciever侦听PHONE_STATE:我的应用程序水渠电池甚至要我释放唤醒锁

 <receiver android:name=".PhoneStateBroadcastReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
     </receiver> 

BroadcastRecieveronRecieve()我开始服务时的状态是OFFHOOK和停止服务时的状态是IDLE

public class PhoneStateBroadcastReceiver extends BroadcastReceiver { 

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

     Bundle bundle = intent.getExtras(); 

     String state = bundle.getString(TelephonyManager.EXTRA_STATE); 
     if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
      context.startService(new Intent(context, ProximityService.class)); 
     } 
     else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
      context.stopService(new Intent(context, ProximityService.class)); 
     } 
    } 

} 

在服务我注册接近传感器监听器,和创建WakeLock所以屏幕将关闭以及而在通话。 后通话结束我停止服务,并在其onDestroy()我注销监听器和释放WakeLock。 但似乎因为我看到一个巨大的电池消耗,从我的应用程序(30%)的东西不释放在那里。

我把日志时,听者注销,并在WakeLock释放,我可以看到WakeLock被释放,听众是未注册成功(我还可以看到日志从SensorManager听者是未注册)。

我在这里错过了什么? 这真是烦人。

服务的某些代码:

public int onStartCommand(Intent intent, int flags, int startId){ 

    Log.d("CALL", "Service started"); 

    // Get an instance of the sensor service, and use that to get an instance of 
    // a particular sensor. 
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 

    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); 

    mAudioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 

    mPowerMngr = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    try{ 
     mWakeLock = mPowerMngr.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, "Proximity"); 

     if (!mWakeLock.isHeld()) { 
      Log.d("CALL", "Wake lock acquired"); 
      mWakeLock.acquire(); 
     } 
    } 
    catch (Exception e){ 
     mWakeLock = null; 
    } 


    return START_STICKY; 
} 

public void onDestroy(){ 
    super.onDestroy(); 
    mSensorManager.unregisterListener(this); 

    if (mWakeLock != null) { 
     if (mWakeLock.isHeld()) { 
      Log.d("CALL", "Wake lock released"); 
      mWakeLock.release(); 
     } 
    } 


      Log.d("CALL", "Service stopped"); 
    } 

日志我看到:

09-30 03:35:09.120: D/SensorManager(21565): unregisterListener:: disable all sensors for this listener, listener = [email protected] 
09-30 03:35:09.125: D/CALL(21565): Wake lock released 
09-30 03:35:09.125: D/CALL(21565): Service stopped 

非常感谢! Elad

回答

1

如果您的服务正在接收多个意向,则您的代码将在每次执行onStartCommand时创建一个新的WakeLock。你会被释放只是最后WakeLock和泄露他人,这可以解释的电池消耗。 logcat的通常会在此时提供有用信息。

由于您的服务保持运行一段时间,你可以检查是否mWakeLock呼吁newWakeLock()之前进行初始化。