当前位置:   article > 正文

Android的BroadcastReceiver简介_broadcastreceiver 接收到消息就会自动销毁吗

broadcastreceiver 接收到消息就会自动销毁吗

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

1、概念:BroadcastReceiver也是Android的四大组件之一,它本质上是一个全局的监听器,用于监听系统全局的广播消息,实现系统中不同组件之间的通信。只要存在与之匹配的Intent被广播出来,BroadcastReceiver总会被激发。指定BroadcastReceiver的Intent既可以在代码中指定,也可以在AndroidManifest中指定。

每次Broadcast事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的OnReceive()方法,此方法执行完后,BroadcastReceiver实例就会被销毁。另外,如果OnReceive方法不能在10秒内执行完成,Android会认为该程序无响应,所以不要在此方法里执行一些耗时的操作。如果确实根据Broadcast来完成一些比较耗时的操作,可以考虑通过Intent启动一个Service来完成。

2、分类:Broadcast分为普通广播和有序广播。

普通广播:完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递效率高。缺点是接收者不能将处理结果传递给下一个接收者,而且无法终止广播。

有序广播:接收者是按预先声明的优先级依次接受广播,接收者可以传递数据给下一个接收者,也可以终止广播继续传播。

下面通过一个示例来演示它们的使用:

本示例在配置优先级时,让FristReceiver的优先级低于SecondReceiver,所以SecondReceiver会先接收到有序广播。

Activity:

  1. package com.home.activity;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import com.home.broadcastreceivertest.R;
  9. public class SendBroadActivity extends Activity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main);
  14. Button sendCommonBroadBtn = (Button) findViewById(R.id.main_btn_send_commonbroad);
  15. Button sendSortBroadBtn = (Button) findViewById(R.id.main_btn_send_sortbroad);
  16. sendCommonBroadBtn.setOnClickListener(new OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. // 发送普通广播
  20. Intent intent = new Intent();
  21. intent.setAction("com.home.Common_BroadCast");
  22. intent.putExtra("msg", "发普通广播啦!!!");
  23. sendBroadcast(intent);
  24. }
  25. });
  26. sendSortBroadBtn.setOnClickListener(new OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. // 发送有序广播
  30. Intent intent = new Intent();
  31. intent.setAction("com.home.Sort_BroadCast");
  32. intent.putExtra("msg", "发有序广播啦!!!");
  33. sendOrderedBroadcast(intent, null);
  34. }
  35. });
  36. }
  37. }


FristReceiver:

  1. package com.home.receiver;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.widget.Toast;
  7. public class FristReceiver extends BroadcastReceiver {
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. // 如果收到的是普通广播
  11. if ("com.home.Common_BroadCast".equals(intent.getAction())) {
  12. String msg = intent.getStringExtra("msg");
  13. Toast.makeText(context, "FristReceiver收到的普通广播为:" + msg,
  14. Toast.LENGTH_SHORT).show();
  15. }
  16. // 如果收到的是有序广播
  17. if ("com.home.Sort_BroadCast".equals(intent.getAction())) {
  18. String msg = intent.getStringExtra("msg");
  19. // 取出上一个广播设置的数据
  20. Bundle bundle = getResultExtras(true);
  21. String PassMsg = "";
  22. if (bundle != null) {
  23. PassMsg = bundle.getString("message");
  24. }
  25. String resultMsg = msg + "\n" + PassMsg;
  26. Toast.makeText(context, "FristReceiver收到的有序广播为:" + resultMsg,
  27. Toast.LENGTH_SHORT).show();
  28. }
  29. }
  30. }

SecondReceiver:

  1. package com.home.receiver;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.widget.Toast;
  7. public class SecondReceiver extends BroadcastReceiver {
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. // 如果收到的是普通广播
  11. if ("com.home.Common_BroadCast".equals(intent.getAction())) {
  12. String msg = intent.getStringExtra("msg");
  13. Toast.makeText(context, "SecondReceiver收到的普通广播为:" + msg,
  14. Toast.LENGTH_SHORT).show();
  15. }
  16. // 如果收到的是有序广播
  17. if ("com.home.Sort_BroadCast".equals(intent.getAction())) {
  18. String msg = intent.getStringExtra("msg");
  19. Toast.makeText(context, "SecondReceiver收到的有序广播为:" + msg,
  20. Toast.LENGTH_SHORT).show();
  21. Bundle bundle = new Bundle();
  22. bundle.putString("message", "传递过程中附加了信息");
  23. // 设置数据到下一个接受者
  24. setResultExtras(bundle);
  25. // 终止广播传递给下一个接受者
  26. // abortBroadcast();
  27. }
  28. }
  29. }

配置receiver和优先级:

  1. <receiver android:name="com.home.receiver.FristReceiver">
  2. <intent-filter android:priority="50">
  3. <action android:name="com.home.Sort_BroadCast"/>
  4. <action android:name="com.home.Common_BroadCast"/>
  5. </intent-filter>
  6. </receiver>
  7. <receiver android:name="com.home.receiver.SecondReceiver">
  8. <intent-filter android:priority="100">
  9. <action android:name="com.home.Sort_BroadCast"/>
  10. <action android:name="com.home.Common_BroadCast"/>
  11. </intent-filter>


 



 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/738382
推荐阅读
相关标签
  

闽ICP备14008679号