2015-09-23 2 views
0

У меня есть BroadcastReceiver с BATTERY_CHANGED IntentFilter. Когда я пытаюсь отправить трансляцию, onReceive не вызывает. Что не так? Вот мое описание приемника в очевидномBroadcastReceiver's onReceive не вызывается при изменении уровня заряда аккумулятора

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

Мой BroadcastReceiver

public class BatteryReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("tag", "onRecv"); 
    int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
    if (level != -1 && scale != -1) { 
     float batteryPct = level/(float) scale; 
     if (batteryPct < 30) { 
      NotificationBuilder.notifyWithActions(context, R.drawable.ic_info_black_24dp, 
        context.getResources().getString(R.string.app_name), 
        context.getResources().getString(R.string.battery), 
        context.getResources().getInteger(R.integer.battery)); 
     } 
    } 
}`} 

Стараюсь

LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(Intent.ACTION_BATTERY_CHANGED)); 
+0

Вы называете это локально? инициируя намерение? – Elltz

+0

Да. Для проверки –

+0

afaik; он не будет работать, вы можете инициировать системные намерения. – Elltz

ответ

3

I я пытаюсь сделать это для обнаружения уровня заряда батареи, и он не работает. Затем для этой задачи я использую для создания трансляции в MainActivity и зарегистрирую ее с действием Intent.ACTION_BATTERY_CHANGED, и нет необходимости регистрировать приемник в manifest.xml, и он работает лучше.

Здесь, когда уровень заряда батареи изменился, выполняется широковещательный вызов и задача в блоке onReceive (Context c, Intent i).

public class MainActivity extends Activity { 
private BroadcastReceiver BatteryReceiver = new BroadcastReceiver() { 
    public void onReceive(Context c, Intent i) { 

     // Getting level of Battery 
     int level = i.getIntExtra("level", 0); 
     Toast.makeText(MainActivity.this,"Battery Level:" +Integer.toString(level) + "%", 
        Toast.LENGTH_SHORT).show(); 
     // For any Level you have to check here. 
     if (level == 100) { 
      Toast.makeText(MainActivity.this, "Battery Full", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // Register receiver with Action and no need to define Broadcast in manifest.xml 
    registerReceiver(BatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 
} 
+0

Спасибо! Оно работает. –

0

Вы можете отправить поддельную систему вещания через ADB:

adb shell am broadcast "intent:#Intent;action=android.intent.action.BATTERY_CHANGED;i.status=5;i.voltage=4155;i.level=100;end" 
Смежные вопросы