Android:创建持久性事件监听器

时间:2011-10-02 17:20:05

标签: android service broadcastreceiver event-listener

我正在试图弄清楚如何实现一个事件监听器(不确定这是否是正确的术语。)我希望该服务一旦我的应用程序启动,就可以监听电话的电源状态。我不确定android如何处理这种情况所以不知道要搜索什么。我一直在使用这个使用广播接收器的代码:

 BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            unregisterReceiver(this);
            int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
            if (plugged == BatteryManager.BATTERY_PLUGGED_AC) {
                // on AC power
                 Toast.makeText(getApplicationContext(), "AC POWER", Toast.LENGTH_LONG).show();
            } else if (plugged == BatteryManager.BATTERY_PLUGGED_USB) {
                // on USB power
             Toast.makeText(getApplicationContext(), "USB POWER", Toast.LENGTH_LONG).show();
                 startActivity(alarmClockIntent);
            } else if (plugged == 0) {
                Toast.makeText(getApplicationContext(), "On Battery", Toast.LENGTH_LONG).show();
            } else {
                // intent didnt include extra info
            }
        }
    };
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(receiver, filter);

代码工作正常。当我打开我的应用程序时,它会干杯电话电源的当前状态。

以下是我要做的事情:

  • 当用户启动应用时,它正在有效地启用服务
  • 用户可以继续使用手机,但一旦插入,我的服务就会抓住并使用上面的代码

如何调整此代码以实现上述目标?

1 个答案:

答案 0 :(得分:1)

您可以通过删除线

让听众保持电池状态
unregisterReceiver(this);

这样,应用程序将继续在后台监听电源状态更改,即使该应用程序未在前台运行。请注意,在某些时候,您可能仍希望取消注册接收器。您可能希望允许用户通过设置来控制它。

另外请注意,您的代码在接收器中包含以下代码中的起始活动:


else if (plugged == BatteryManager.BATTERY_PLUGGED_USB) {
    // on USB power
    Toast.makeText(getApplicationContext(), "USB POWER", Toast.LENGTH_LONG).show();
    startActivity(alarmClockIntent);
} 

如果您的活动在后台,则无法启动其他活动。请参阅this SO Question - how to start activity when the main activity is running in background?,已接受的答案提供了有关如何处理需要从后台启动活动的情况的建议