2011-09-07 79 views
0

我尝试实施一个IntentService,其中BroadcastReceiverSCAN_RESULTS_AVAILABLE_ACTION有反应。IntentService中的广播接收器(服务已泄漏意向接收器)

当调用onReceive时,IntentService应该比较列表。我总是得到

“服务已泄露IntentReceiver”

错误,即使我注销在onDestroy()BroadcastReceiver

下面是代码:

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 
    } 
} 

哪里是在代码中的问题?

为什么我不断收到此错误?

我仍然需要学习很多关于Android的知识,但我认为IntentService是正确的路要走,因为我不期望这个班有任何结果。当我发送呼叫stopService()时它应该停止。这个IntentService被另一个IntentService调用!那是问题吗?

感谢您的帮助。

回答

4

尝试OnCreate()而不是OnStartCommand()注册BroadcastReceiver

这应该解决您的问题。

+0

我试过了,但Receiver没有注册了。我创建了Wifi Receiver对象并在super.onCreate()后注册了Receiver; – Benjamin

+0

使用onHandleIntent代替onStartCommand会更好吗? – Benjamin

+0

好吧,现在它被注册了。谢谢 – Benjamin

5

我试图实现与上SCAN_RESULTS_AVAILABLE_ACTION反应的广播接收器的IntentService。

这在很大程度上毫无意义。希望您的接收器最多可以注册几秒钟。

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

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

当我发送一个呼叫stopService()时,它应该停止。

您从未在IntentService上致电stopService()。一旦onHandleIntent()返回,IntentService自行停止。这就是为什么您的BroadcastReceiver将在几秒钟内被移除 - 您的onHandleIntent()应该只运行几秒钟。

此IntentService由另一个IntentService调用!

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

+0

@CommononsWare ..可能这是无关紧要的。但我仍然需要你看看我的问题,并给我一个线索。这是它http://stackoverflow.com/questions/7344652/is-it-possible-to-insert-a-field-for-existing-contact-in-android-2-1 – ngesh

+0

什么是实现这一点的好方法?我想在后台运行广播接收器// – DAVIDBALAS1

+0

@ DAVIDBALAS1:使用''元素将接收器注册到清单中。 – CommonsWare