zoukankan      html  css  js  c++  java
  • BroadcastReceiver 的动态注册和静态注册问题

    最近开发的小项目涉及到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

  • 相关阅读:
    Python深入05 装饰器
    Python深入04 闭包
    Python深入03 对象的属性
    Ubuntu (虚拟机同样) 更换内核?
    .out
    GCC 编译详解
    linux 编译内核 /boot空间不足?
    Java Swing提供的文件选择对话框
    Java Swing 实时刷新JTextArea,以显示不断append的内容?
    为什么要编译Linux内核?
  • 原文地址:https://www.cnblogs.com/tiejiangweigaibianercunzai/p/3991871.html
Copyright © 2011-2022 走看看