6

我已经看过提到registerReceiver必须调用(未在清单中定义)才能接收ACTION_BATTERY_LOW意图的帖子。

public class MainActivity extends Activity
{

   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       //....  
      registerReceiver(new BatteryLevelReceiver(), new IntentFilter(
                                              Intent.ACTION_BATTERY_LOW));
   }
   // .......
}

广播接收器

public class BatteryLevelReceiver extends BroadcastReceiver
{
    private static final String TAG = BatteryLevelReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d(TAG, "onReceive");
    }
}

我在 logcat 中没有看到“onReceive”日志语句。我正在使用模拟器来模拟电池电量不足的状态,使用telnet 5554和执行power capacity 10. 我确实看到模拟器中的电池状态发生了变化,但没有触发意图。

另外,如果我必须registerReceiver()在活动中调用并且我不调用unregisterReceiveror onStoponDestroy可以吗?如果不行,即使我的应用不在前台,我将如何注册接收器以接收系统意图?(除了使用清单)。

4

4 回答 4

5

确保:

  1. 您正在将“充电器连接”设置为“无”
  2. 电池状态为“正在放电”
于 2016-10-06T13:26:51.097 回答
2

您可以在清单中添加以下代码。

<receiver android:name=".yourpackage.BroadCastNotifier" >
  <intent-filter>
    <action android:name="android.intent.action.BATTERY_LOW" />
  </intent-filter>
</receiver>

在你的BroadCastNotifier Class

package yourpackage;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BroadCastNotifier extends BroadcastReceiver {
    private final static String TAG = "BroadCastNotifier"; 
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();

        if(Intent.ACTION_BATTERY_LOW.equalsIgnoreCase(intentAction)){
            Log.e(TAG, "GOT LOW BATTERY WARNING");          
        }
    }

}

当您的电池电量不足时,您将收到日志消息GOT LOW BATTERY WARNING,也可以在您的设备中尝试此操作。

尽管上述代码可能工作的最佳方法是不使用 BroadCast 进行此类操作,但您可以按照此处所述监控电池电量。您可以使用下面的代码确定您的电池,这更容易。

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

float batteryPct = level / (float)scale; 
于 2013-01-03T05:36:10.673 回答
1

关键是用telnet命令禁用充电

power ac off

如果您随后将电池电量设置为低容量

power capacity 1

意图将被触发

于 2015-06-29T12:02:12.783 回答
-1

您可以在清单中注册- 请在此处ACTION_BATTERY_LOW查看我的详细答案- 您无法在清单中注册。ACTION_BATTERY_CHANGED

您没有收到它的原因可能是您忘记在清单中声明您的 RECEIVER

另外,如果我必须registerReceiver()在活动中调用并且我不调用unregisterReceiveror onStoponDestroy可以吗?

不,您应该在ALWAYS上注册onResume和取消注册- 在被调用后,您的接收器将不会收到onPauseonPause

如果不行,即使我的应用不在前台,我将如何注册接收器以接收系统意图?(除了使用清单)。

仅在清单中

于 2013-09-22T17:03:22.890 回答