广播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

posted @ 2017-10-31 17:57  WidgetBox  阅读(320)  评论(0编辑  收藏  举报