最近开发的小项目涉及到notification通知栏的交互问题,通知栏的各种点击事件响应通过使用broadcast实现,由于一开始没有想到使用handler提交通知栏执行后的状态或者说是信息。一直纠结与怎么注册broadcast的问题,这里先说一下注册的事情。
众所周知,注册可以在manifest.xml里面注册,还有就是在代码里面注册。
在manifest里面的注册形式是这样子的:
<receiver android:name=".继承broadcastReceiver的class"> <intent-filter android:priority="900"> <action android:name="com.action。~~~"/> </intent-filter> </receiver>
当然这里的注册是这个继承了broadcastreceiver的类是一个外部类而不是内部类,这个问题下面再继续说;
在代码里面动态注册的话,网上面有好多种说法了,有的说在oncreate()里面注册然后在ondestory()的时候取消注册的,也有的说在onstop()里注册然后在onresume()里面取消的,总之我想说的是,动态注册不适合我要的项目需求,因为动态注册找不到一个合适的地方时activity在退到后台的时候也能够接收到广播。所以我也只能够选择在manifest里面注册全局广播了。这样其实也挺好的,但是问题出现了:如果专门开一个类来继承broadcastreceiver的话,我在这里面还要调用许多activity里面的方法(有网友说用接口,但是我弄很久感觉也挺复杂,初学者就是这么纠结~~~),这样的话我会改动更多的代码,没办法就去想着在activity里面用内部类来继承broadcastreceiver,然后在manifest中注册 以接收广播,但是问题又出现了,原来没有用过broadcast,所以注册就更不知道了,折腾了很久才发现,原来内部类的注册就不是这样子写了:“<receiver android:name=".NotificationTool"> ”,要以A$B的形式来写,但是这必须要求这个内部类是以public static的形式出现,具体原因我就不说明了,网上有讲解。这样导致的问题就是所有内部类里的变量必须为static的!!!卧槽,这样子的话更多麻烦的事情又来了,所以最终还是放弃了这样的想法。果断重新开一个class来继承broadcastReceiver,但是问题还是没有解决掉,因为我需要在收到通知执行相应方法后返回给通知栏作出相应改变,比如图标的改变。但是activity运行后就是静态的在那里了,怎么才能够去改变他的状态~~~~~~~~~~~~,后来才知道使用handler把信息交给运行在主线程的activity处理。
好啦,现在开始琢磨使用handler去处理这个问题,但是问题又来了 我去!
如何在activity和这个继承了broadcastReceiver的类之间传递handler呢?
想啊想,最后参考了网上的方法:写一个公共的class,在发送通知的时候把handler传给他保存,然后在通知执行后再从这个公共类里面拿出handler,然后handler.sendmessage()。
这个过程也是经历了无数次的调试和修改,最终还是搞定了。
这个再说一下网友说的其他方式,其中涉及到了使用application的一种方法,开始没有明白application是在两个或以上activity之间保存公共数据的东西,我搞了半天才发现我的是一个activity和一个普通类,结果费了很多时间但是没有解决问题
这个是一个网友采取application的方式解决传递handler的问题:
http://blog.csdn.net/jason0539/article/details/18055259 值得参考
另外一种就是使用通知了,由于我的demo里面这个部分已经是使用了通知接收了,我担心如果再用通知的话,我估计自己也看不懂我的代码了,然后我也放弃了这种方式来解决问题。
当然这也不失为一种高效的方式,也是上面那位网友的总结,在此贴出来:
http://blog.csdn.net/jason0539/article/details/18075293(这个我没有细看)
我的大致代码如下:
存handler的公共类:
HandlerShare.java
import android.os.Handler; public class HandlerShare { public static Handler handler = null; //get handler public Handler getHandler() { return handler; } //set handler public void setHandler(Handler handler) { HandlerShare.handler = handler; } }
处理handler.sendmessage()消息的类:
public class ChangeActivity extends Activity implements OnClickListener { public HandlerShare handlerShare; public Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case NotificationTool.PLAY_ID: break; } } }; ~~~~ protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ~~~~~~~~~~~ //得到share的handler handlerShare = new HandlerShare(); } //在通知栏显示自定义的view public void showNotification(){ ~~~~ //设置共享handler变量 handlerShare.setHandler(mHandler); } }
最后是通知接收到后执行相应方法 然后handler.sendmessage的类
public class NotificationTool extends BroadcastReceiver{ private HandlerShare handlerShare = null; private Handler mHandler = null; ~~~~~~~~~~~~ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub sendHandlerMessage(RECORD_ID); } private void sendHandlerMessage(int what){ //获得共享的handler变量 handlerShare = new HandlerShare(); mHandler = handlerShare.getHandler(); //发送message mHandler.sendEmptyMessage(what); } }
涉及到handler代码就是这些了,自己写的代码太粗糙,不好意思都贴出来了哈哈!
其实,在这其中还有一些疑问没有解决,因为网上说onreceive()是运行在主线程当中的,而handler是用来处理主线程和其他线程之间的问题的,但是在这里为什么能够处理呢,肯定是哪里还没有搞清楚的原因,只怪自己Java太差~~
最后附上一个讲解broadcastReceiver的文章:
http://blog.csdn.net/flowingflying/article/details/29863871