0

我想監視電池電量,如果它達到一定的水平,我想做的事情。 我擔心的是不必要地耗盡太多電池。正確優化的方式來監測android中的電池電量

使用服務將繼續在後臺運行。此外,如果我使用android.intent.action.BATTERY_CHANGED意圖,它會檢查電池級別的每一個變化。根據我的要求,這兩種方法可能會消耗不必要的電池。

因此,如果我使用AlarmManager(它也是由OS處理的服務),它將檢查每個用戶定義的電池級別(適當的時間)。

以下是我已實施的代碼。

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

private AlarmManager mAlarmManager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_main); 

     mAlarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     Intent intentAlarm = new Intent(this, AlarmReceiverTest.class); 

     // User defined time 
     long fiveMin= (AlarmManager.INTERVAL_FIFTEEN_MINUTES/3); // adjustment here 

     mAlarmManager.setRepeating(AlarmManager.RTC, 
        System.currentTimeMillis()+fiveMin, oneMin, 
        PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); 

    } 

} 

廣播接收機:

public class AlarmReceiverTest extends BroadcastReceiver { 

@Override 
public void onReceive(Context pContext, Intent arg1) { 

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = pContext.registerReceiver(null, ifilter); 

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
    int percent = (level*100)/scale; 

    if(percent== myThreshold) 
     //DO-SOMETHING 
} 

}

在清單:

<receiver android:name="AlarmReceiverTest"> 
    <intent-filter> 
     <action android:name="android.intent.action.BATTERY_CHANGED"/> 
    </intent-filter> 
</receiver> 

許可:

android.permission.BATTERY_STATS 

由於其重複報警,即使應用程序關閉,它也會繼續檢查。

例如:DO-SOMETHING:如果應用程序已經打開,可能會鎖定應用程序如果應用程序已關閉,則不允許打開該應用程序。

這是正確的做法,並且我的理解是正確的嗎? 請建議我是否有其他正確的方法。

編輯:

如果我要檢查電池電量,每5-10小時間隔,這將是這樣做的最好方法是什麼?

+0

爲什麼人們downvote這個了什麼? @Sats答案非常適合我需要的。 – hellaandrew 2016-03-16 05:27:52

回答

5

您不需要使用AlarmManager類。如果您使用AlarmManager類,則您的應用程序會消耗更多電量。

最簡單的方法是使用intent ACTION_BATTERY_CHANGED的廣播監聽器。

public class AlarmReceiverTest extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      int batteryLevel = intent.getIntExtra(
        BatteryManager.EXTRA_LEVEL, 0); 
      int maxLevel = intent 
        .getIntExtra(BatteryManager.EXTRA_SCALE, 0); 
      int batteryHealth = intent.getIntExtra(
        BatteryManager.EXTRA_HEALTH, 
        BatteryManager.BATTERY_HEALTH_UNKNOWN); 
      float batteryPercentage = ((float) batteryLevel/(float) maxLevel) * 100; 

      // Do something with batteryPercentage and batteryHealth. 
      // batteryPercentage here ranges 0-100 
     } 
    } 

onReceive在每次電池電量發生變化時都會運行。

在您的主要活動註冊的廣播接收器:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    AlarmReceiverTest mBatteryLevelReceiver = new AlarmReceiverTest(); 
    registerReceiver(mBatteryLevelReceiver, new IntentFilter(
      Intent.ACTION_BATTERY_CHANGED)); 
} 
+0

我也同意AlarmManager不是必需的 - ACTION_BATTERY_CHANGED不會非常頻繁地調用。值得重申的是,按照http://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED,這個接收者必須在代碼中註冊,而不是在manifest中註冊。 – Okas 2014-09-19 12:02:32

+0

因此,如果我沒有取消註冊這個廣播,那麼即使在應用程序關閉之後,它也會一直在更換電池上繼續運行。 – OnePunchMan 2014-09-19 12:12:04

+0

是的,如果你想停止它,使用這個:@Override public void onDestroy(){ super.onDestroy(); unregisterReceiver(mBatteryLevelReceiver); } – Sats 2014-09-19 12:18:11