Для этой магии существует простое заклинание. В той Activity, где будет происходить длительный процесс, который лучше не прерывать, вставляем проверку:
private int checkBatteryLow(){ BroadcastReceiver wIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // Получаем сообщение от девайса String wAction = intent.getAction(); if(wAction.equals(Intent.ACTION_BATTERY_CHANGED)) { // Здесь можно информировать пользователя об изменении // заряда батареи } else if(wAction.equals(Intent.ACTION_BATTERY_LOW)) { // Здесь можно информаровать пользователя о низком // заряде батареи } } }; // Создаем фильтры IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_BATTERY_LOW); // Подключаем получателя сообщений от девайса с установленными фильтрами Intent intent = this.registerReceiver(wIntentReceiver, filter); // Получем значение "level" из данных о заряде батареи Object l = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); Object s = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); int level = (Integer)l; int scale = (Integer)s; if (level >= 0 && scale > 0) { level = (level * 100) / scale; } // Отключаем получателя unregisterReceiver(wIntentReceiver); return level; }
После этого в нужном месте вызываем проверку и получаем из нее число, показывающее текущий заряд батареи (от 0 до 100). Это значение проверяем с надуманным пороговым значением и по езультатам проверки принимаем решение, запускать ли длительный процесс в приложении или заставить пользователя зарядить девайс.