我有一個執行後臺更新的服務。禁用電池百分比更新
我想讓用戶在電池電量達到一定水平時禁用更新。
從我的研究,我會在我的服務類的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