我在APP中配置一个静态广播接收类MyTestReceiver ,为了当监听到事件时,去获取公共类 WebUtil中类成员addressConfig的属性ip值。
问题1、
我先启动APP,在一个Activity 活动中对公共类中静态成员属性设置值,例如 公共类 WebUtil中类成员addressConfig 设置ip=192.168.1.59, 然后退出APP进程。当系统接收到静态广播消息,MyTestReceiver 中 onReceive()方法执行WebUtil.addressConfig.getIp()值为初始值192.168.1.2,这个是什么原因?
问题2、
MyTestReceiver 中 静态属性对象 testThread 这样设置好吗,其生命周期是什么情况呢,会一直存在内存中吗?我测试了一下,当关闭App时,不存在活动的Activity时,当接收到静态消息,该线程testThread还是会存在。
public class WebUtil{
Public static final AddressConfig addressConfig =new AddressConfig();
....
}
public class AddressConfig
{
private String ip=192.168.1.2;
public String getIp(){
return this.ip;
}
private String mac;
...
}
public class MyTestReceiver extends BroadcastReceiver {
public static Thread testThread=null;
static {
testThread=new Thread( new Runnable(){
while(true){
............
}
})
}
@Override
public void onReceive(Context context, Intent intent) {
System.out.println(WebUtil.addressConfig.getIp());
}
}
清单文件中的静态广播是向系统注册的,所以你app虽然挂掉了,广播依然存在于系统;
你通过方法赋值给广播里的静态变量,这时你的app是活着的,你可以理解为广播是个普通的Java类,
静态变量的生命周期是跟随类的消失而消失,所以当你app挂掉了,广播的这个类如果被销毁或者回收了,静态变量也自然销毁了;
而前面也说到,清单文件的广播,是注册在系统里面的,系统发出广播时,一个Receiver接收到广播的前提是匹配到action等条件,
其次才会实例化Receiver类,所以你的静态变量肯定是初始值
如果你想要实现静态变量的值跟随改变的话,建议你换个思路,将ip存入到sp,当接收到广播时,从本地再取出来
首先while(true)没有退出的话一定是错误的写法,无论什么情况
你的app可能被杀死,杀死之后你的静态类的值就不存在了,然后广播来了app被唤醒,此时的app就和刚打开一样,初始化addressConfig =new AddressConfig();。初始化之后当然还是默认的“192.168.1.2”了。
如上所说,保存在sp里,如果你的addressConfig 都是系统的东西,那么在new下面加上静态代码块初始化的时候就赋值完成也行