zoukankan      html  css  js  c++  java
  • 广播broadcast的使用

    很多时候我们有这样的需求,比如说,订单支付成功,需要更新订单列表或订单详情的订单状态,这时候我们就可以用到广播.

    首先我们要使用Intent来发送一个广播

    定义一个全局的广播名字

    public static final String DOLOGOUTTRUE ="com.example.se7en.dreamcity.do_logout_true"; 
    Intent intent
    = new Intent();
    intent.setAction(DOLOGOUTTRUE);
    intent.putExtra(
    "dolog_true", "dolog_true");
    sendBroadcast(intent);

    注册方式:

    1、创建一个继承与BroadcastReceiver的类

    实现继承的方法

    在使用回调函数来实现 你想要发送的参数,然后在activity判断这个字符串是不是发送的这个,如果是,进行更新。

    public class DologoutReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String isTrue = intent.getStringExtra("dolog_true");
            if (onDologoutTrue != null) {
                onDologoutTrue.getIstrue(isTrue);
            }
    
        }
    
        public interface OnDologoutTrue {
            void getIstrue(String state);
        }
    
        public OnDologoutTrue onDologoutTrue;
    
        public void setOnDologoutTrue(OnDologoutTrue onDologoutTrue) {
            this.onDologoutTrue = onDologoutTrue;
        }
    }

    在AndroidManifest中注册这个广播

    切记 action里的name 和你定义的全局变量DOLOGOUTTRUE的内容一样

    <receiver android:name=".receiver.DologoutReceiver">
        <intent-filter>
            <action android:name="com.example.se7en.dreamcity.do_logout_true"></action> 

      </intent-filter>
    </receiver>

    在需要更新的页面 初始化,方法扔oncrete里面就可以。

    /**
     * 广播接收者
     */
    private void initReceiver() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(DOLOGOUTTRUE);
        DologoutReceiver receiver = new DologoutReceiver();
        registerReceiver(receiver, intentFilter);
        receiver.setOnDologoutTrue(this);
    }

    最后一步,在你的activity里implements 你的回调函数,完成未实现的方法。

    public class MainActivity extends AppCompatActivity implements View.OnClickListener, DologoutReceiver.OnDologoutTrue 
    @Override
    public void getIstrue(String state) {
        if (state.equals("dolog_true")) {
            loginDialog.show();
        }
    }

    2、代码动态注册广播

    orderReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equals(StaticInApp.UPDATE_ORDER_DETAIL_NEW)) {
                getOrderInfo();
            }
        }
     };
    
    IntentFilter filter_update = new IntentFilter();
    filter_update.addAction(StaticInApp.UPDATE_ORDER_DETAIL_NEW);
    registerReceiver(orderReceiver, filter_update);

    切记onDestroy里解注册广播

    @Override
    protected void onDestroy() {
       super.onDestroy();
       if(orderReceiver!=null){
          unregisterReceiver(orderReceiver);
       }
    }

    遇到的坑:

    父类里面定义的广播,子类就算重写receiver,也不会接收到。最好的方法是在各自的子类定义各自的receiver和对应的action。

                                                         By LiYing

  • 相关阅读:
    c++最大公约数
    c++判断一个整数里面是否包含 3 这个数字
    动态使用webservice,以及含有ref类型的参数的问题
    带有用户名密码验证的远程文件下载
    注册表
    fsdfasfsa
    C# addin 开发心得记录
    c# 读写注册表
    like的性能问题
    查找表中多余的重复记录(多个字段)
  • 原文地址:https://www.cnblogs.com/widgetbox/p/7762809.html
Copyright © 2011-2022 走看看