2017-01-22 127 views
1

我正在嘗試製作電池報警應用程序。我正在閱讀Android文檔,發現我們不需要註冊BroadcastReceiver。我們可以做這樣的事情這 -Android電池廣播

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

我的問題是 -

  • 系統是否廣播意圖(含電池狀態)每次 電池電量的變化?
  • 我必須每次查詢電池電量嗎?
  • 此外,如何在電池電量達到 特定級別(由用戶設置)時播放鬧鐘。
+0

檢查[公文](https://developer.android.com/training/monitoring-device -state/battery-monitoring.html) –

回答

2

這裏是一個全樣本取電池級

private float getBatteryLevel() { 
    Intent batteryStatus = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    int batteryLevel = -1; 
    int batteryScale = 1; 
    if (batteryStatus != null) { 
     batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel); 
     batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale); 
    } 
    return batteryLevel/(float) batteryScale * 100; 
    } 

回答你的問題:

1 - 是的,你可以通過getExtra得到更多的信息和確定鍵,BatteryManager有很多的密鑰從意圖中提取信息。

2-不,您只需根據活動或片段生命週期註冊接收者並註銷它,通常在onCreate()/onCreateView()中註冊並取消註冊onDestry()/onDestroyView()

3-您可以創建一個具有簡單通知界面的綁定服務。註冊您reciever就可以了,從以前的樣品,你可以做這樣的事情:

if (getBatteryLevel < 10) { 
//show notification or do whatever you want. 
} 
0

首先在清單文件中添加意圖過濾器:

<receiver android:name=".BatteryLevelReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.BATTERY_LOW"/> 
    <action android:name="android.intent.action.BATTERY_OKAY"/> 
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
    </intent-filter> 
</receiver> 

在項目中添加新的類後:

public class PowerConnectionReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 
          status == BatteryManager.BATTERY_STATUS_FULL; 

     int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
    } 
} 

對於獲取電池級:

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

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

float batteryPct = level/(float)scale; 

更多信息這個鏈接:developer.android

0

創建接收器獲取信息..這是更好的方法。

public class PowerConnectionReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || 
          status == BatteryManager.BATTERY_STATUS_FULL; 

     int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
    } 
} 

在清單中添加

<receiver android:name=".PowerConnectionReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
    <action android:name="android.intent.action.BATTERY_LOW"/> 
    <action android:name="android.intent.action.BATTERY_OKAY"/> 
    </intent-filter> 
</receiver> 

更多信息請訪問LINK

0
Q1. Yes, system provide every time . 
Example :  
     private class BatteryBroadcastReceiver extends BroadcastReceiver { 
      private final static String BATTERY_LEVEL = "level"; 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       int level = intent.getIntExtra(BATTERY_LEVEL, 0); 
       mBatteryLevelText.setText(getString(R.string.battery_level) + " " + level); 
       mBatteryLevelProgress.setProgress(level); 
      } 
     } 


//Register our BroadcastReceiver in application 

    BatteryBroadcastReceiver mReceiver = new BatteryBroadcastReceiver(); 
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 


//Update your progress bar get 

    public class MainActivity extends Activity { 
     private TextView mBatteryLevelText; 
     private ProgressBar mBatteryLevelProgress; 
     private BroadcastReceiver mReceiver; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      mBatteryLevelText = (TextView) findViewById(R.id.textView); 
      mBatteryLevelProgress = (ProgressBar) findViewById(R.id.progressBar); 
      mReceiver = new BatteryBroadcastReceiver(); 
     } 
     @Override 
     protected void onStart() { 
      registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
      super.onStart(); 
     } 
     @Override 
     protected void onStop() { 
      unregisterReceiver(mReceiver); 
      super.onStop(); 
     } 
     private class BatteryBroadcastReceiver extends BroadcastReceiver { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
       mBatteryLevelText.setText(getString(R.string.battery_level) + " " + level); 
       mBatteryLevelProgress.setProgress(level); 
if(level<10){ 
// play Battery alarm. 

      } 
     } 
    }