我有一个执行后台更新的服务。禁用电池百分比更新
我想让用户在电池电量达到一定水平时禁用更新。
从我的研究,我会在我的服务类的onCreate
方法使用一个接收器,例如:
public class MainService extends Service
{
@Override
public void onCreate()
{
this.registerReceiver(this.BatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
private BroadcastReceiver BatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
int level = intent.getIntExtra("level", 0);
}
};
}
我假设,最好的做法是离开服务运行,请检查服务中的电池电量,而不是根据百分比执行CPU密集型代码?
我实际上并不需要停止服务本身,并根据电池的百分比重新启动服务?
UPDATE:
这似乎是一个更好的解决方案,但不是100%肯定。我在AndroidManifest
注册的BroadcastReceiver
:
<receiver android:name="BatteryReceiver" />
然后创建一个BroadcastReceiver:
public class BatteryReceiver extends BroadcastReceiver
{
@Override
public void onReceive(final Context context, final Intent intent)
{
final int currentBatteryPercent = intent.getIntExtra("level", 0);
final int disableBatteryPercent = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(context).getString("batteryPercent", 0);
//AlarmReceiver is the service that performs the background updates
final ComponentName component = new ComponentName(context, AlarmReceiver.class);
if (currentBatteryPercent < disableBatteryPercent)
{
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
}
else
{
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP);
}
}
}
谢谢,只是需要一些验证。 – 2012-03-18 17:49:59
我提出包管理器的唯一原因是基于这个问题,这是由Android Framework工程师之一回答的:http://stackoverflow.com/questions/2782448/android-how-to-start-a -service-at-boot-based-on-user-settings/3465986虽然这可能不是一回事,因为这个问题是关于在启动时禁用服务,而不是在某个电池级别? – 2012-03-18 18:48:45
是的,你不应该真的使用上下文来阻止你的应用程序中的组件,这让我觉得非常糟糕的做法和哈克。 (杀掉东西,即使它不杀死应用程序,总是很可怕,并导致一些粘性行为)。一个更清洁的解决方案是将该级别存储在AlarmManager中的某个地方,这实际上是进行更新的地方,这是(在我看来)迄今为止最干净的方式。 – 2012-03-18 18:53:46