BroadcastReceiver广播接收器

BroadcastReceiver广播接收器

BroadcastReceiver是为了方便Android系统各个应用程序以及程序内部进行通信,Android系统引入了一套广播机制。各个应用程序之间可以对感兴趣的广播进行注册,当系统或其他程序发出这条广播时,对发出的广播进行注册过的程序便能够收到这条广播。Android系统中有一套完整的API,允许程序只有的发送和接收广播。
注意:不要在广播中处理过多逻辑或是进行任何耗时过久的操作,因为在广播中是不允许开启线程的;当 onReceiver()方法运行时间超过10S还没有结束的话,程序会报错(ANR),广播的时候是扮演打开其他组件的角色,例如启动Service,Notification提示,Activity等。

在Android系统中广播主要有两种类型:
1.标准广播(Normal Broadcasts)
是一种完全异步执行的广播,在广播播出之后,所有的广播接收器会在同一时间接收到这条广播,广播无法被截断。
发送方式:

Intent intent = new Intent("com.example.servicedemo.BORADCAST_TEST");
	sendBroadcast(intent);

2.有序广播(Ordered Broadcasts):
是一种同步执行的广播,在广播发出之后,优先级高的广播接收器可以优先接收到这条广播,并可以在优先级较低的广播接收器接收之前截断停止掉这条广播。
发送方式:

Intent intent = new Intent("com.example.servicedemo.BORADCAST_TEST");
	//第二个参数是与权限相关的字符串
	sendoradeBroadcast(intent,null);

广播注册:
在Android的广播接收机制中,如果需要接收广播,就需要创建广播接收器。而创建广播接收器的方法就是新建一个类(可以是单独新建一个类,也是有是内部类)继承BraadcastReceiver,然后使用。

public class MyBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

动态注册和静态注册的区别
动态注册的广播接收器可以自由的控制注册和取消,有很大的灵活性。但是只能在程序启动之后才能收到广播,广播接收器的注销实在 onDestroy() 方法中的。所有广播接收器的生命周期和活动的生命周期一样。
静态注册的广播不受程序是否启动的约束,当程序关闭之后也还是可以接收广播。

两种方式注册广播:
动态注册
就是在代码中注册,步骤如下:
1.实例化自定义的广播接收器。
2.创建 IntentFilter 实例。
3.调用 IntentFilter 实例的 addAction()方法添加监听的广播类型。
4.最后调用 Context 的registerReceiver(BroadcastReceiver ,IntentFilter) 注册的广播。
注意:如果需要接收系统广播(电量变化,网络变化等)需要在 AndroidManifest.xml 文件中添加权限!!!

静态注册

<receiver android:name=".MyBroadcastReceiver">
       <intent-filter>
          <action android:name="com.example.MY_BROADCAST"></action>
       </intent-filter>
</receiver>

动态注册广播示例:
1.注册广播

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("MyBroadcast","onReceive()");
    }
}

2.注册广播接收器

public class MainActivity extends AppCompatActivity {

    private MyBroadcastReceiver myBroadcastReceiver;
    private Button button ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //动态注册广播接收器
        myBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcastdemo.MyBroadcastReceiver");
        registerReceiver(myBroadcastReceiver,intentFilter);
             
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销广播
        unregisterReceiver(myBroadcastReceiver);
        Log.e("注销广播---------","unregisterReceiver");

    }
}

3.在 SecondActivity 中发送广播

public class SecondActivity extends AppCompatActivity {
    private Button button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcastdemo.MyBroadcastReceiver");
                sendBroadcast(intent);
            }
        });
    }
}

在这里插入图片描述
说明在 MainActivity 中接收到了广播。

静态注册广播示例:
1.(同上1)
2.注册接收器(同上2)

//动态注册广播接收器
        myBroadcastReceiver = new MyBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcastdemo.MyBroadcastReceiver");
        registerReceiver(myBroadcastReceiver,intentFilter);

3.发送广播

public class SecondActivity extends AppCompatActivity {
    private Button button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                // Android 8.0 以上系统不再支持这种方式。
//                Intent intent = new Intent("com.example.broadcastdemo.MyBroadcastReceiver");
                Intent intent = new Intent();
                intent.setComponent(new ComponentName(SecondActivity.this,MyBroadcastReceiver.class));
                sendBroadcast(intent);
            }
        });
    }
}

4.在 AndroidManifest.xml 中注册

<receiver android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.broadcastdemo.MyBroadcastReceiver"></action>
        </intent-filter>
</receiver>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值