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