2013-05-07 48 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

相关问题