• android 发送广播,进行消息通讯


    问题描述:

    项目开发中经常会碰到各种各样的要求,比如Activity(Fragment)之间传值,方式方法还挺多。

    但是如果隔了好几个Activity(Fragment)或者有很多地方需要同步更新,那么就会用到通知了。

    大概几个步骤:

    1、申明一个类,继承BroadcastReceiver(具体负责接收通知的,通知到了负责处理显示在UI)

    2、注册一个通知(干活以后,等待接收通知,要一个结果就行,哪里需要通知,那里注册)

    3、发送通知给注册者(什么时候,什么地方开干,干完活,我(发送者)通知你(注册者)结果)

    4、反注册通知(不管收没收到通知,都得注销广播)

    下面我们来看一下具体的实现:

    /**
    * 广播接收器
    * @author len
    * @modify jiduoduo
    */
    public class MsgReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
        //接收通知,更新UI

           //比如传一个字符串,或者一个实体类或集合

           //有了intent就方便多了。这里收的是一个intent,那么发送肯定也要这样一个intent。

           //下面是个传字符串的

           //收到通知,将日期显示在tv_time(TextView)

           String time = intent.getStringExtra("time","");

           tv_time.setText(time);
        }

    }

    // 那么光有干活的还不行,得有地方干活,谁有活干,谁注册

    // 干活以后,要个结果

    private MsgReceiver msgReceiver; //建个通知管道,有了这个就可以收到通知了。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       //动态注册广播接收器
       msgReceiver = new MsgReceiver();
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction("com.example.xx.RECEIVER");//这里面的Action可以根据你的包来,这里的包是com.example.xx
       registerReceiver(msgReceiver, intentFilter);//如果是在fragment,那么getActivity().registerReceiver(msgReceiver, intentFilter);

    }

    //不管有没有收到通知,注册了就要注销

    protected void onDestroy() {

          //注销广播

          unregisterReceiver(msgReceiver);//如果是在fragment,那么getActivity().unregisterReceiver(msgReceiver);

          super.onDestroy();

    }

    //下面就要到具体的地方处理了,比如说付款成功以后,给需要的地方通知一个消息。

    Intent intent = new Intent("com.example.xx.RECEIVER");  //这里的action要一致。

    intent.putExtra("time", "2020-03-16");

    sendBroadcast(intent);  //如果是在fragment,那么getActivity().sendBroadcast(intent); 


    参考:https://blog.csdn.net/xiaanming/article/details/9750689

    这兄弟写的挺不错的,里面是一个下载进度的例子,通过二种方法来实现。

    说明:

    以上是动态注册,还可以静态的注册,具体的在AndroidManifest.xml中用。

    类似这种,具体的可以参考这位兄弟的。

    https://www.jianshu.com/p/989e7c2f9293

    <receiver android:name=".MyBroadcastReceiver">   

       <intent-filter>         
          <action android:name="android.intent.action.NEW_OUTGOING_CALL" />    
       </intent-filter>
    </receiver>

    总结:
    上面只是一个传值的通知,比较简单,但已经可以满足大部分的需求。
    也可以通过serivce来处理一些请求,
    还有
    Notification显式的通知用户。


  • 相关阅读:
    电脑提示无法装入/加载SolidWorks DLL文件:sldshellutils如何解决
    vmware vpshere 安装完的必备工作
    建立AD域,修改密码后不重启生效命令
    VMware vSphere 6 Enterprise Plus 注册码
    VMware-viclient-all
    域控中将组策略应用到安全组
    Windows server 2003域控迁移到2012
    SecureCRT 基本设置
    linux之"server" directive is not allowed here in
    wordpress(二)wordpress环境迁移
  • 原文地址:https://www.cnblogs.com/jiduoduo/p/12502353.html
Copyright © 2020-2023  润新知