使用BroadcastReceiver peekService,而不将活动绑定到我的服务

时间:2015-12-17 23:17:01

标签: android service broadcastreceiver wifimanager

我需要实现定期扫描avaliables wifis网络的服务,并保存该信息以供我随时使用。为此,我实现了一个在android启动时启动的服务,我希望该服务始终运行,独立于我的活动。我想从广播接收器访问扫描数据,并使用来自Broadcast Receiver类的peekService方法访问它。我的问题是,如果我的服务(我确定正在运行)没有绑定到一个Activity,那么peekservice将返回null。因此,对于测试,我使用bindService()方法将我的服务与我的主要活动绑定在一起,并且peekService不会返回null。但是我真的想要使用那些数据,而不必将Activity绑定到服务,任何人都知道如何做到这一点?

PS:我也不想将服务中的意图传递给广播接收器,我想用我的" get"方法,因为我想在需要时访问信息,而不是在扫描完成时访问。

这是我的广播接收器启动服务

public class StartMyContextCollector extends BroadcastReceiver {

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

        if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)){
            context.startService(new Intent(context, ContextCollectorService.class));


        }
    }
}

这就是我的服务

public class ContextCollectorService extends Service {
    WifiManager wifiManager;
    private ArrayList<Bundle> wifiEvents = new ArrayList<Bundle>();
    List<ScanResult> scanList;
    WifiListReceiver wifiReceiver;


    public class LocalBinder extends Binder {
        public ContextCollectorService getService(){
            return ContextCollectorService.this;
        }
    }


    @Override
    public IBinder onBind(Intent intent) {

        return new LocalBinder();
    }



    @Override
    public void onCreate() {

        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiReceiver = new WifiListReceiver();
        registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    }

    public ArrayList<Bundle> getWifiEvents(){
        return this.wifiEvents;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        wifiManager.startScan();

        return Service.START_STICKY;

    }

    class WifiListReceiver extends BroadcastReceiver{

        @SuppressLint("UseValueOf")
        @Override
        public void onReceive(Context context, Intent intent) {
            scanList = wifiManager.getScanResults();
            Bundle numberWifis = new Bundle();
            numberWifis.putString("NUMBER_OF_WIFI", String.valueOf(scanList.size()));
            wifiEvents.add(numberWifis);
            for (int i = 0; i < scanList.size(); i++) {
                Bundle wifiEvent = new Bundle();
                wifiEvent.putString("SSID", scanList.get(i).SSID);
                wifiEvent.putString("BSSID", scanList.get(i).BSSID);
                wifiEvents.add(wifiEvent);
            }
        }
    }
}

我正在做什么来获取我想要的广播接收器中的信息

ArrayList<Bundle> wifiEvents = null;
        IBinder binder = peekService(context, new Intent(context, ContextCollectorService.class));
        if (binder != null) {
            ContextCollectorService service = ((ContextCollectorService.LocalBinder) binder).
                    getService();
            wifiEvents = service.getWifiEvents();

        }

在我的主Activity中,我创建了一个连接,并在onStart()命令中使用了bindService方法,将Activity与Service绑定在一起,但那是我不想做的。

1 个答案:

答案 0 :(得分:0)

peekService()的文档未完全描述获取IBinder所需的条件。正如Dianne Hackborn(Google Android工程师)在this post中所解释的那样:&#34;调用startService()是不够的 - 您需要为同一意图调用bindService(),因此系统具有为它检索IBinder&#34;。您的结果会确认此行为:如果您之前已将服务绑定到某个活动,则会获得IBinder,但仅在该服务刚启动时才会获得。{/ p>