首页 > 解决方案 > 如何使注册电池广播在清单中而不是在活动中工作

问题描述

我正在尝试对电池更换执行操作。为此,我使用了以下代码:

public class BatteryBroadcastReceiver extends 
BroadcastReceiver {

DatabaseHelper db;

@Override
public void onReceive(Context context, Intent intent) {

db = new DatabaseHelper(context);
String cont1 = db.usercontact().toString();

String action = intent.getAction();
if (action != null && action.equals(Intent.ACTION_BATTERY_CHANGED)) {

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

    if(percentage <=  20){
       // doing something like getting location
    }
}
}

我已经在我的活动中注册了我的广播:

public class Battery extends AppCompatActivity {

  private BatteryBroadcastReceiver batteryReceiver = new BatteryBroadcastReceiver();
  private IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_location);

 }

@Override
protected void onResume(){
super.onResume();
registerReceiver(batteryReceiver,intentFilter);
}

@Override
protected void onPause(){
unregisterReceiver(batteryReceiver);
super.onPause();
}

这段通用代码工作正常,但它限制了我只能进行此活动(可能是因为在此活动中注册了广播)。就像只要此活动保持打开状态,我就可以执行某些任务,但是当我关闭它时,当电池电量不足时,它不会执行任何任务。现在我不知道该怎么办。我的应用程序中还有其他活动,即使我不在此活动中,我也希望它能够工作。有什么方法可以在清单中注册它,以便它可以整体工作。我试过这样做,但更换电池时没有任何反应。提前感谢您的帮助:)。

标签: androidbroadcastreceiverandroid-manifestbatterymanager

解决方案


不再可以ACTION_BATTERY_CHANGED在清单中注册。请参阅https://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED

如果您想Intent在所有活动中被此广播触发,您可以通过以下两种方式之一执行此操作:

  • 在您的每一项活动中注册和取消注册接收器。您可以通过创建一个BaseActivity处理注册和注销的来简化这一点BroadcastReceiver,然后从 扩展您的所有活动BaseActivity
  • 当您的应用在自定义Application类或onCreate()您的第一个Activity. 不要取消注册接收器。这会导致少量内存泄漏,但我不会担心。

推荐阅读