IntentService中的广播接收器(服务泄露了IntentReceiver)

时间:2011-09-07 17:03:36

标签: android

我尝试实施IntentService BroadcastReceiverSCAN_RESULTS_AVAILABLE_ACTIONIntentService作出反应。

onReceive应该在每次调用BroadcastReceiver时比较列表。

总是得到

  

“服务已泄露IntentReceiver”

即使我取消注册onDestroy()中的public class MyClass extends IntentService { private HashMap<String, List<String>>; private WifiManager mWifiManager; private WifiReceiver mWifiReceiver; public MyClass() { super("MyClass"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); mWifiReceiver = new WifiReceiver(); registerReceiver(mWifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mWifiManager.createWifiLock(WifiManager.WIFI_MODE_SCAN_ONLY,"ScanLock"); mWifiManager.setWifiEnabled(true); return START_NOT_STICKY; } @Override public void onDestroy(){ unregisterReceiver(mWifiReceiver); mWifiManager.setWifiEnabled(false); } @Override protected void onHandleIntent(Intent intent) { // TODO Auto-generated method stub } class WifiReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Here I do my stuff with the scan results //should be called every 5 seconds } } ,也会出现

错误。

以下是代码:

IntentService

代码中的问题在哪里?

为什么我一直收到此错误?

我仍然需要学习很多关于Android的知识,但我认为stopService()是正确的方法,因为我不希望这个类产生任何结果。它应该在我发送电话IntentService时停止。此IntentService由另一个{{1}}调用!那是问题吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

  

我尝试使用对SCAN_RESULTS_AVAILABLE_ACTION作出反应的BroadcastReceiver实现IntentService。

这基本上没有意义。你的接收器最多可以注册几秒钟,希望如此。

  

我仍然需要学习很多关于Android的知识,但我认为IntentService是正确的方法,因为我不期望这个类有任何结果。

这没有任何意义。当您需要在后台线程中执行一些简短的工作时,可以使用IntentService。例如,如果您使用AlarmManager每15分钟检查一封新电子邮件,或者您有大型文件下载活动,则可以使用IntentService

  

当我发送一个调用stopService()时它应该停止。

您永远不会在stopService()上致电IntentServiceIntentService返回onHandleIntent()后自动停止。这就是为什么您的BroadcastReceiver将在几秒钟内被移除的原因 - 您的onHandleIntent()应该只运行几秒钟。

  

此IntentService由另一个IntentService调用!

这不太可能是一个好的设计。

答案 1 :(得分:4)

尝试在BroadcastReceiver而不是OnCreate()

中注册OnStartCommand()

那应该解决你的问题。