问题描述:

项目开发中经常会碰到各种各样的要求,比如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中用。

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐