BroadcastReceiver onReceive()没有被调用,该如何处理
BroadcastReceiver onReceive()没有被调用
代码个功能是在activity中启动service,在service中获取相关数据后广播给activity,activity刷新界面,但是activity中的onReceive怎么也不执行。
说明:使用的是动态注册
这个是activity代码:
package com.jade.hust;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.ListView;
import com.example.indoorpostion.R;
public class MainActivity extends Activity {
private static final String Jade = "JADE";
private ConnectivityManager cm;
private LocationManager lm;
private WifiManager wifiManager;
private List<ScanResult> WifiList;
private List<Wifi> list;
private ListView listView;
private MyReceiver mr;
private WifiAdapter wa;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mian);
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);//获得wifi管理器
if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
//获得listview控件
listView=new ListView(this);
listView = (ListView) findViewById(R.id.wifi_list);
wifiManager.startScan();//开始扫描wifi
WifiList=wifiManager.getScanResults();//返回扫描结果
list=new ArrayList<Wifi>();//用list存储需要的wifi信息
for(int i=0;i<WifiList.size();i++){
Wifi wifi=new Wifi();
wifi.setSSID(WifiList.get(i).SSID);
wifi.setLEVEL(WifiList.get(i).level);
list.add(wifi);
}
wa=new WifiAdapter(this,list);//初始化适配器
listView.setAdapter(wa);//设置适配器
startService(new Intent(this,WifiListenerService.class));//启动监听wifi变化的服务
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
//checkWifiGps();
Log.e("JADE","onResume=.............");
mr=new MyReceiver();//广播接收器,接收来自后台服务更新的wifi信息
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.communication.RECEIVER");//设置拦截器
this.registerReceiver(mr, filter);//注册广播
super.onResume();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.e("JADE","onDestroy.............");
super.onDestroy();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.e("JADE","onPause=.............");
this.unregisterReceiver(mr);//注销广播
super.onPause();
}
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("JADE","wifilist=.............");
}}
}
service代码:
package com.jade.hust;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
public class WifiListenerService extends Service {
private WifiManager wifim;
private WifiReceiver wr;
private List<ScanResult> WifiList;
private List<Wifi> list;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i("JADE","onCreate=.............");
wifim=(WifiManager) getSystemService(Context.WIFI_SERVICE);//获得wifi管理器
wr= new WifiReceiver(); //创建广播接收器,接收系统wifi信息变化
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
unregisterReceiver(wr);//注销广播
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
IntentFilter filter=new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wr, filter);//注册广播
scanWifi();
// new Thread(){//新建线程,1秒更新一次
// public void run(){
// while (true) {
// scanWifi();
// try {
// sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
//
//
// }.start();
super.onStart(intent, startId);
}
private void scanWifi() {//扫描wifi
// TODO Auto-generated method stub
if(!wifim.isWifiEnabled())
wifim.setWifiEnabled(true);
wifim.startScan();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
WifiList = wifim.getScanResults();
list=new ArrayList<Wifi>();
for(int i=0;i<WifiList.size();i++){
Wifi wifi=new Wifi();
wifi.setSSID(WifiList.get(i).SSID);
wifi.setLEVEL(WifiList.get(i).level);
list.add(wifi);
}
Intent intentM=new Intent();
intentM.putExtra("list", (Serializable)list);
intent.setAction("com.example.communication.RECEIVER");
LocalBroadcastManager.getInstance(context).sendBroadcast(intentM);//将扫描更新的结果广播
Log.i("JADE","onReceive=.............");
}
}
}
}
实在是没有检查出问题来,网上也搜了很久,求大神赐教
------解决思路----------------------
com.example.communication.RECEIVER 是什么?
------解决思路----------------------
代码好好贴,看着头大,试试这句
------解决思路----------------------
发送广播的时候用了 LocalBroadcastManager,那应该注册接收广播的时候也要用。
------解决思路----------------------
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.e("JADE","onPause=.............");
this.unregisterReceiver(mr);//注销广播
super.onPause();
}
你是不是切换页面把广播注销了
------解决思路----------------------
你注册广播的时候,在oncreate中注册啊,你在onresume中注册,都没被执行到。。。
------解决思路----------------------
在wifi状态发生改变的时候系统本身就会发出一个广播,为什么还要多此一举的自己去不断检查再发送广播告诉Activity呢?!直接在Activity中写一个广播接受者接收系统的广播不就行了。
代码个功能是在activity中启动service,在service中获取相关数据后广播给activity,activity刷新界面,但是activity中的onReceive怎么也不执行。
说明:使用的是动态注册
这个是activity代码:
package com.jade.hust;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.ListView;
import com.example.indoorpostion.R;
public class MainActivity extends Activity {
private static final String Jade = "JADE";
private ConnectivityManager cm;
private LocationManager lm;
private WifiManager wifiManager;
private List<ScanResult> WifiList;
private List<Wifi> list;
private ListView listView;
private MyReceiver mr;
private WifiAdapter wa;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mian);
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);//获得wifi管理器
if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
//获得listview控件
listView=new ListView(this);
listView = (ListView) findViewById(R.id.wifi_list);
wifiManager.startScan();//开始扫描wifi
WifiList=wifiManager.getScanResults();//返回扫描结果
list=new ArrayList<Wifi>();//用list存储需要的wifi信息
for(int i=0;i<WifiList.size();i++){
Wifi wifi=new Wifi();
wifi.setSSID(WifiList.get(i).SSID);
wifi.setLEVEL(WifiList.get(i).level);
list.add(wifi);
}
wa=new WifiAdapter(this,list);//初始化适配器
listView.setAdapter(wa);//设置适配器
startService(new Intent(this,WifiListenerService.class));//启动监听wifi变化的服务
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
//checkWifiGps();
Log.e("JADE","onResume=.............");
mr=new MyReceiver();//广播接收器,接收来自后台服务更新的wifi信息
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.communication.RECEIVER");//设置拦截器
this.registerReceiver(mr, filter);//注册广播
super.onResume();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.e("JADE","onDestroy.............");
super.onDestroy();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.e("JADE","onPause=.............");
this.unregisterReceiver(mr);//注销广播
super.onPause();
}
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("JADE","wifilist=.............");
}}
}
service代码:
package com.jade.hust;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
public class WifiListenerService extends Service {
private WifiManager wifim;
private WifiReceiver wr;
private List<ScanResult> WifiList;
private List<Wifi> list;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i("JADE","onCreate=.............");
wifim=(WifiManager) getSystemService(Context.WIFI_SERVICE);//获得wifi管理器
wr= new WifiReceiver(); //创建广播接收器,接收系统wifi信息变化
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
unregisterReceiver(wr);//注销广播
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
IntentFilter filter=new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wr, filter);//注册广播
scanWifi();
// new Thread(){//新建线程,1秒更新一次
// public void run(){
// while (true) {
// scanWifi();
// try {
// sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
//
//
// }.start();
super.onStart(intent, startId);
}
private void scanWifi() {//扫描wifi
// TODO Auto-generated method stub
if(!wifim.isWifiEnabled())
wifim.setWifiEnabled(true);
wifim.startScan();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
WifiList = wifim.getScanResults();
list=new ArrayList<Wifi>();
for(int i=0;i<WifiList.size();i++){
Wifi wifi=new Wifi();
wifi.setSSID(WifiList.get(i).SSID);
wifi.setLEVEL(WifiList.get(i).level);
list.add(wifi);
}
Intent intentM=new Intent();
intentM.putExtra("list", (Serializable)list);
intent.setAction("com.example.communication.RECEIVER");
LocalBroadcastManager.getInstance(context).sendBroadcast(intentM);//将扫描更新的结果广播
Log.i("JADE","onReceive=.............");
}
}
}
}
实在是没有检查出问题来,网上也搜了很久,求大神赐教
------解决思路----------------------
com.example.communication.RECEIVER 是什么?
------解决思路----------------------
代码好好贴,看着头大,试试这句
content.sendBroadcast(intentM);
------解决思路----------------------
发送广播的时候用了 LocalBroadcastManager,那应该注册接收广播的时候也要用。
------解决思路----------------------
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.e("JADE","onPause=.............");
this.unregisterReceiver(mr);//注销广播
super.onPause();
}
你是不是切换页面把广播注销了
------解决思路----------------------
你注册广播的时候,在oncreate中注册啊,你在onresume中注册,都没被执行到。。。
------解决思路----------------------
在wifi状态发生改变的时候系统本身就会发出一个广播,为什么还要多此一举的自己去不断检查再发送广播告诉Activity呢?!直接在Activity中写一个广播接受者接收系统的广播不就行了。