广播
静态注册广播
- 可以通过as直接创建一个广播接收者类,new->other->BroadcastReceiver,这个类继承自BroadcastReceiver,并重写onReceive方法,在方法中添加toast
package com.example.broadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "静态注册广播,接收到广播1,", Toast.LENGTH_SHORT).show();
}
}
- 在Manifest.xml文件中配置intent-filter,添加action属性(自定义),接收器也是通过这个action去接收广播的。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="broadcast1"/>
</intent-filter>
<intent-filter>
<action android:name="broadcast3"/>
</intent-filter>
</receiver>
- 然后在MainActivity中添加点击事件发送广播,android8.0以后必须添加包名,否则接收不到。
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("broadcast1");
intent.setPackage("com.example.broadcastdemo");
sendBroadcast(intent);
}
动态注册广播
- 定义一个内部类,添加Toast
class MyBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "动态注册广播", Toast.LENGTH_SHORT).show();
}
}
- 在onCreate注册动态广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("broadcast2");
myBroadCast = new MyBroadCast();
registerReceiver(myBroadCast,intentFilter);
- 最后通过点击事件来发送广播
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("broadcast2");
sendBroadcast(intent);
}
- 在onDestroy中取消注册,否则会出现内存泄漏
protected void onDestroy() {
unregisterReceiver(myBroadCast);
super.onDestroy();
}
注意:静态注册是在mainfest中配置action,然后在发送的时候通过intent去设置对应的action,该广播接收器就能接收到了,在android8.0以后还要添加包名。动态注册是在activity中声明action,即用即注销,所以必须注销广播否则会导致内存泄漏。
一个广播接收器接收不同应用所发出的广播
首先新建一个其他项目,sendBroad的方法发送广播,同样添加包名,代码如下:
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("broadcast3");
intent.setPackage("com.example.broadcastdemo");
sendBroadcast(intent);
}
在广播接收器的配置文件中添加action属性
<intent-filter>
<action android:name="broadcast3"/>
</intent-filter>
最后如何来区别是哪个程序发出的广播,通过getAction()方法区别是哪个广播,这里扩展还能通过intent传数据,然后接收后,供这个接收器使用。代码如下:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (intentAction.equals("broadcast1")){
Toast.makeText(context, "静态注册广播,接收到广播1,", Toast.LENGTH_SHORT).show();
}else if (intentAction.equals("broadcast3")){
Toast.makeText(context, "静态注册广播,接收广播3", Toast.LENGTH_SHORT).show();
}
}
}
|