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