我有一项执行后台更新的服务。
我希望为用户提供在电池百分比达到一定水平时禁用更新的选项。
根据我的研究,我将在我的服务类的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密集型代码?
根据电池百分比,我实际上并不需要停止服务本身并重新启动它?
更新
这似乎是一个更好的解决方案,但不是100%肯定。我在BroadcastReceiver
注册了AndroidManifest
:
<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);
}
}
}
答案 0 :(得分:2)
没错。您通常要做的是为更新安排一些广播意图(可能通过AlarmManager)。当您收到电池电量不足的通知时,您将把它存放在您的服务中,然后在进行更新之前,检查以确保电池电量不会太低。 here是观看电池电量的好教程。在处理此意图时,您不应该做太多事情,只需将电池电量保持在某个位置(并在进行更新之前),确保它适当地“充满”。
您的更新是一种非常错误停止应用的方式。通常,要求程序包管理器停止组件比解决方案更具攻击性。相反,您应该将一些代码移动到实际进行更新的组件中,并在那里存储/更新电池信息的信息。在进行更新之前,请检查电池电量并不要继续,除非它处于您更新应用程序的水平。使用广播接收器很好,但是你需要在某个地方存储关卡(也许是一个sharedprefs)。相反,这就是为什么将接收器放在您进行更新的服务中的原因可能是最好的。
答案 1 :(得分:1)
是否可以使用broadcastReceiver管理此要求,而不是连续运行服务?
public void onReceive(final Context context, final Intent intent) {
if(intent != null && intent.getAction() != null) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
// Set alarm
}
else if(action.equals(Intent.ACTION_BATTERY_LOW)) {
setLocationAlarmReceiverEnabled(context, false);
}
else if(action.equals(Intent.ACTION_BATTERY_OKAY)) {
setLocationAlarmReceiverEnabled(context, true);
}
}
}