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

  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/widgetbox/p/7762809.html
Copyright © 2011-2022 走看看