BroadCastReceiver广播

1.什么是广播?

1.广播是Android四大组件之一,全称BroadCastReceiver。
2.广播分为发送方和接收方,就算没有接收方,发送方也会发送数据。
3.广播可以实现跨多个页面的数据通信。
4.广播可以实现跨进程间的数据通信

2.广播的分类及区别—–有序广播和无序广播

有序广播:
按照接收者的优先级,逐一传递,优先级最高的接收者先接受,如果不终止此广播,再往下传递
无序广播:
不管有多少接收者,一旦发出了无序广播,所以监听此广播的接收者都能接收到

3.广播的注册方式及区别—–静态注册和动态注册

静态注册:
1.先新建类继承BroadcastReceiver
2.然后实现OnReceive抽象方法
3.再AndroidManifest中注册BroadcastReceive
4.最后有Context环境中通过sendBroadcast发送广播
动态注册:
1.新建一个类继承BroadcastReceiver
2.实现OnReceive抽象方法
3.在代码中实例化新建类的广播类
4.在代码中实例化IntentFilter
5.调用IntentFilter对象的addAction方法设置频道
6.在有context环境中调用registerReceiver注册广播
7.在有context环境中通过sendBroadcast发送广播
8.在有context环境中通过unregisterReceiver
区别:
动态注册的广播会受Activity的生命周期的影响, 当Activity销毁的时候,广播就失效了。而静态注册的广播,即使Activity销毁了,仍然可以收到广播,即使杀死进程也依然可以运行。但是我们一般用到的是动态注册,动态注册相比来说更加的方便也能更有选择性的去使用,不需要像静态注册那么固定

4.静态注册无序广播

public class BroadcastActivity extends AppCompatActivity implements View.OnClickListener {  
    private Button broadcast_btn;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_broadcast);  

        broadcast_btn = findViewById(R.id.broadcast_btn);  
        broadcast_btn.setOnClickListener(this);  
    }  

    @Override  
    public void onClick(View view) {  
        switch (view.getId()) {  
            case R.id.broadcast_btn:  
                Intent intent=new Intent();  

                intent.setAction("com.fly.fm106.9");  
                Bundle bundle=new Bundle();  
                bundle.putString("name","张三");  
                intent.putExtras(bundle);  

                //发送广播  
                sendBroadcast(intent);  
                break;  
            default:  
                break;  
        }  

    }  
}  

再写一个内部类用来接收广播发出的消息

class MyReceiver extends BroadcastReceiver{  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        String name=intent.getStringExtra("name");  
        Bundle bundle=getResultExtras(true);  
        Log.e("MyReceiver", "接收者"+name);  
    }  
}  

最后在这个方法后面用快捷键提示在manifest中注册

5.静态注册有序广播

其他的与静态无序广播大体相同,唯一不同的地方是在Manifest中注册时多加了一个优先级

<receiver android:name=".broadcast.MyReceiver">  
        <intent-filter android:priority="100">  
               <action android:name="Intercept_Stitch" />  
        </intent-filter>  
</receiver>  

6.动态注册无序广播

        myReceiver=new MyReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.fly.shoppingcar.price");
        registerReceiver(myReceiver,intentFilter); 
@Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }

在运行的app被销毁时还行解绑,这也就完成了动态无序广播

7.动态注册有序广播

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shopping_car);
        addBroadCast = new FirstBroadCast();    
        IntentFilter addfilter = new IntentFilter();    
        addfilter.addAction(MY_BROADCAST_ACTION);    
        addfilter.setPriority(100);    
        registerReceiver(addBroadCast, addfilter);    


        lessenBroadCast = new TwiceBroadCast();    
        IntentFilter lessenfilter= new IntentFilter();    
        lessenfilter.addAction(MY_BROADCAST_ACTION);    
        lessenfilter.setPriority(5);    
        registerReceiver(lessenBroadCast, lessenfilter);
        }

通过

addfilter.setPriority(100);
lessenfilter.setPriority(5);

来设置优先级;

8.适配器中发送广播示例

//动态注册广播
    private void initReceiver() {
        myReceiver=new MyReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.fly.shoppingcar.price");
        registerReceiver(myReceiver,intentFilter);

    }
    class MyReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            int price=intent.getIntExtra("price",0);
            sum_prise.setText((sumprise+price)+"");
        }
    }
viewHolder.addIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction("com.fly.shoppingcar.price");
                    intent.putExtra("price",f.getPrise());
                    context.sendBroadcast(intent);
                }
            });
            viewHolder.lessenIV.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction("com.fly.shoppingcar.price");
                    intent.putExtra("price",-f.getPrise());
                    context.sendBroadcast(intent);
                }
            });
@Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }

我这里是在适配器中用到缓存原理添加数据,然后再ViewHolder中来进行广播的传值,再在Activity中创建一个内部类继承BroadcastReceiver来接收,最后写onDestroy方法中完成解绑工作。

9.Service中发送广播示例

public class ImageBroadcast extends Service{  

    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                try {  
                    URL url=new URL("https://360.cn/timg?image&imgtype=jpg&src=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D1950000289%2C454533439%26fm%3D214%26gp%3D0.jpg");  
                    HttpURLConnection connection= (HttpURLConnection) url.openConnection();  
                    InputStream inputStream=connection.getInputStream();  
                    Bitmap bitmap= BitmapFactory.decodeStream(inputStream);  
                    Log.e("3213112342", "run: "+bitmap);  

                    Intent intent=new Intent();  
                    intent.setAction("com.example.myapplication.img");  
                    intent.putExtra("bitmap",bitmap);  
                    sendBroadcast(intent);  

                } catch (MalformedURLException e) {  
                    e.printStackTrace();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }).start();  

        return super.onStartCommand(intent, flags, startId);  
    }  
    @Nullable  
    @Override  
    public IBinder onBind(Intent intent) {  
        return null;  
    }  


}  

先注册好广播,并且用到解析图片的方法得到图片,再在Activity中来接收

 @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_image_broadcast);  

        MyReceiver1 myReceiver1=new MyReceiver1();  
        IntentFilter intentFilter=new IntentFilter();  
        intentFilter.addAction("com.example.myapplication.img");  
        registerReceiver(myReceiver1,intentFilter);  

        img_broadcast=findViewById(R.id.img_broadcast);  


        Intent intent = new Intent(ImageBroadcastActivity.this, ImageBroadcast.class);  
        startService(intent);//启动service  
    }  
    class MyReceiver1 extends BroadcastReceiver{  

        @Override  
        public void onReceive(Context context, Intent intent) {  
            Bitmap bitmap=intent.getParcelableExtra("bitmap");  
            img_broadcast.setImageBitmap(bitmap);  

        }  
    }  

通过上述的步骤,就能完成Service中发送广播了

10.系统广播

系统广播,顾名思义,就是系统自带的广播,你只能用,不能改;
下面介绍一些常用的系统广播:
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
重启设备 Intent.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android Studio 中注册广播接收器(BroadcastReceiver)需要以下步骤: 1. 创建一个继承自 BroadcastReceiver 的类,这个类将处理接收到的广播消息。例如,你可以创建一个名为 MyBroadcastReceiver 的类。 ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 在这里处理接收到的广播消息 } } ``` 2. 在 AndroidManifest.xml 文件中声明广播接收器。在 `<application>` 标签内部添加如下代码: ```xml <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.ACTION_NAME" /> <!-- 添加其他需要匹配的 action --> </intent-filter> </receiver> ``` 其中,`android:name` 属性指定了广播接收器的类名,`.MyBroadcastReceiver` 表示当前包名下的 MyBroadcastReceiver 类。`android:enabled` 和 `android:exported` 属性分别用于启用和导出广播接收器。 3. 在你需要发送广播的地方,创建一个 Intent 对象,并使用 `sendBroadcast()` 方法发送广播。 ```java Intent intent = new Intent(); intent.setAction("android.intent.action.ACTION_NAME"); // 添加其他需要传递的数据 sendBroadcast(intent); ``` 其中,`"android.intent.action.ACTION_NAME"` 是你自定义的广播 action,用于匹配注册的广播接收器。 这样,当发送的广播 action 与注册的广播接收器的 action 匹配时,MyBroadcastReceiver 类中的 `onReceive()` 方法将被调用,你可以在该方法中处理接收到的广播消息。记得在不需要接收广播时,及时取消注册广播接收器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值