静态广播重复创建对象
来源:互联网 发布:数据库中索引是什么 编辑:程序博客网 时间:2024/05/21 15:01
项目有一个监听来电并做一个弹窗的需求。
于是乎首先想到的是静态注册,然而在运行过程中发现,只能让弹窗显示,移除弹窗的时候缺没有移除。。。
<receiver android:name=".PhoneStateReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE</span> </intent-filter> </receiver>
下面代码是根据网上的代码改的,项目代码就不贴了,都懂得。。。
http://www.iteye.com/topic/1118711 这是传送门
WindowManager wm;TextView tv;public void onReceive(Context context,Intent intent){ String action = intent.getAction(); if(action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); int state = telephony.getCallState(); if(state == TelephonyManager.CALL_STATE_RINGING){ wm = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.format = PixelFormat.RGBA_8888; tv = new TextView(context); tv.setText("来电号码:" + incomingNumber); wm.addView(tv, params); }else if(state == TelephonyManager.CALL_STATE_IDLE){ if(wm != null){ wm.removeView(tv); } } }跟踪代码可以发现在wm.removeView的时候 wm和tv都是空的。
因为从来电到接听时间较短,所以不会是资源被回收掉了。
多次调试发现,每次调用广播接收器的时候,都会new BroadReceiver对象。。。。。
自然在广播接受到CALL_STATE_IDLED的时候,wm和tv实际上是个未赋值的null对象
无奈只能曲线救国了。
改变启动广播的机制
首先注册开机广播
然后在开机广播中启动服务,这里我就不多写了
下面是服务中的的onCreate方法中的代码
public void onCreate() { super.onCreate(); CallinFloatWindowBroadcast mBroadcastReceiver = CallinFloatWindowBroadcast.getInstance(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); registerReceiver(mBroadcastReceiver, intentFilter); }
在Service中使用单例模式的广播,这样就保证了每次调用的receiver都是同一个对象
wm能成功移除了
1 0
- 静态广播重复创建对象
- 22 广播静态创建代码案例
- 避免创建重复的对象
- 避免创建重复的对象
- 避免创建重复的对象
- 避免创建重复的对象
- 静态注册的广播每次接收广播都会重新生成一个接收广播的对象
- java避免创建重复的对象
- JAVA:避免重复的创建对象
- 动态广播与静态广播
- 静态广播与动态广播
- 静态广播和动态广播
- 只实例化一个静态实例,避免重复创建实例
- 创建InetAddress对象的四个静态方法
- 创建InetAddress对象的四个静态方法
- js 没有对象或者 重复创建对象的报错
- [Android]静态广播监听器
- android 静态注册广播
- for循环 ,listview
- 关于PHP的一些常用的字符串处理函数
- 进程间通信方式
- CV牛人牛事简介之一
- javascript的基础数据类型
- 静态广播重复创建对象
- TClientDataSet的ApplyUpdates的方法
- 人脸数据库
- Constraint 代码实验室--带你一步步理解使用 ConstraintLayout
- 最全的静态网站生成器(开源项目)
- oracle表空间操作
- 在myeclipse中基于Hibernate框架开发的入门小程序
- 调整python默认递归深度
- 工作窃取算法