BroadCastReceiver

什么是广播

1:广播是Android四大组件之一,全称BroadCastReceiver。

2:广播分为发送方和接收方,就算没有接收方,发送方也会发送数据。

3:广播可以实现跨多个页面的数据通信。

4:广播可以实现跨进程间的数据通信


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

有序广播:按照接收者的优先级,逐一传递,优先级最高的接收者先接受,如果不终止此广播,再往下传递

无序广播:不管有多少接收者,一旦发出了无序广播,所以监听此广播的接收者都能接收到


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

静态注册:

1.先新建类继承BroadcastReceiver 
2.然后实现OnReceive抽象方法 

3.再AndroidManifest中注册BroadcastReceive

4.最后有Context环境中通过sendBroadcast发送广播

代码如下:

 <receiver android:name="">
            <intent-filter>
                <action android:name="" />
            </intent-filter>
 </receiver>

动态注册:

1.新建一个类继承BroadcastReceiver 
2.实现OnReceive抽象方法 
3.在代码中实例化新建类的广播类 
4.在代码中实例化IntentFilter 
5.调用IntentFilter对象的addAction方法设置频道 
6.在有context环境中调用registerReceiver注册广播 
7.在有context环境中通过sendBroadcast发送广播 

8.在有context环境中通过unregisterReceiver

区别:

1.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收          器。静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

2.当广播为有序广播时:
          1 优先级高的先接收
          2 同优先级的广播接收器,动态优先于静态
          3 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。  
3.当广播为普通广播时:
         1 无视优先级,动态广播接收器优先于静态广播接收器
         2 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

静态注册无序广播

代码展示:

Activity:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.myapplication.R;

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("Intercept_Stitch");
                Bundle bundle=new Bundle();
                bundle.putString("name","蟑国庆");
                intent.putExtras(bundle);

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

    }
}

再建一个接收广播的类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;


public 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);
    }
}

AndroidManifest中:

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

静态注册有序广播

和上面差不多,

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.broadcast_btn:
                Intent intent=new Intent();
                //定义广播事件类型
                intent.setAction("Intercept_Stitch");
                Bundle bundle=new Bundle();
                bundle.putString("name","蟑国庆");
                intent.putExtras(bundle);

                //发送广播
                sendOrderedBroadcast(intent,null);
                break;
            default:
                break;
        }

    }

接收和上面一样

AndroidManifest:

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

动态注册无序广播

Activity:

myBoradCast = new MyBoradCast();
IntentFilter intentFilter =  new IntentFilter();
intentFilter.addAction("com.example.mytest.MY_BROADCAST");
registerReceiver(myBoradCast,intentFilter);

动态注册有序广播

动态有序在动态无序上添加个属性

myBoradCast = new MyBoradCast();
IntentFilter intentFilter =  new IntentFilter();
//优先级
intentFilter.setPriority(1);
intentFilter.addAction("com.example.mytest.MY_BROADCAST");
registerReceiver(myBoradCast,intentFilter);


适配器中发送广播示例

适配器中:

viewHolder.add_img.setOnClickListener(new View.OnClickListener() {

            int x=1;
            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction("com.example.paopao.price");
                intent.putExtra("price",f.prise);
                context.sendBroadcast(intent);
                x++;

                viewHolder.perPice.setText(x+"");
            }
        });
在activity类里面创建一个内部类继承BroadcastReceiver

class MyRecrvie extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            double price=intent.getDoubleExtra("price",0);
            sumprise+=price;
            double value=new BigDecimal(sumprise).setScale(2, RoundingMode.HALF_UP).doubleValue();
            sum_prise.setText(""+value);
        }

注册广播

private void initReceive() {
        myRecrvie=new MyRecrvie();
        intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.paopao.price");
        registerReceiver(myRecrvie,intentFilter);

    }

Service中发送广播示例

新建一个类继承servince

import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


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://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529499172843&di=1bd010d32a1b039f9e1836fd4fc86b48&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;
    }


}

注册广播,接收图片

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import com.example.myapplication.R;

public class ImageBroadcastActivity extends AppCompatActivity {
    private ImageView img_broadcast;

    @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);

        }
    }

}


系统广播

常见的操作:

监听网络变化 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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值