【android开发-15】android中广播broadcast用法详解
1,broadcast类型
在Android中,Broadcast是一种用于在应用程序组件之间传递消息的机制。它允许一个组件(发送者)将消息发送给其他组件(接收者),即使它们之间不存在直接的联系。
Android中的Broadcast类型主要有以下几种:
1,普通广播(Ordinary Broadcast):这是默认类型的广播。当一个应用程序组件发送广播时,所有注册的广播接收器都会收到该广播。这种广播不会对接收者的数量进行限制。
2,有序广播(Ordered Broadcast):这是一种特殊的广播类型,可以按照接收者的优先级顺序逐个传递广播。发送者可以设置广播的优先级,并指定一组广播接收器按照优先级顺序接收广播。当一个接收者处理完广播后,广播会继续传递给下一个接收者。
3,系统广播(System Broadcast):系统广播是由操作系统或系统应用程序发送的广播。这些广播通常用于通知系统级别的操作,例如电量不足、内存不足等。应用程序可以注册系统广播的接收器来监听这些事件,并根据需要执行相应的操作。
4,粘性广播(Sticky Broadcast):这是一种特殊的系统广播类型,用于在一段时间内保持广播的传递。当一个粘性广播发送时,如果当前没有注册的接收器,则会在一段时间内保持传递,直到有接收器注册并接收该广播。这种广播通常用于需要持续通知的情境,例如网络连接变化等。
这些不同类型的广播可以根据需要选择使用,以满足不同的通信需求。
2,动态注册broadcast
在Android中,动态注册广播(Broadcast)需要遵循以下步骤:
1,创建BroadcastReceiver类:首先,你需要创建一个BroadcastReceiver类,该类将用于接收广播并处理接收到的广播数据。你可以在该类中重写onReceive()方法,该方法在接收到广播时被调用。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理接收到广播的逻辑
// 可以在这里根据intent的内容进行相应的处理
}
}
2,实例化BroadcastReceiver:在你的应用程序中,你需要创建一个BroadcastReceiver的实例,以便能够接收广播。
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
3,创建IntentFilter:创建一个IntentFilter对象,该对象用于指定你想要接收的广播的Action。例如,如果你想要接收网络连接变化(CONNECTIVITY_CHANGE)的广播,你可以使用以下代码:
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例
4,注册BroadcastReceiver:使用registerReceiver()方法来注册BroadcastReceiver。你需要传递一个BroadcastReceiver对象和一个IntentFilter对象作为参数。注册后,你的BroadcastReceiver将会接收到指定Action的广播。
registerReceiver(myBroadcastReceiver, filter);
5,注销BroadcastReceiver:当你的应用程序不再需要接收广播时,你需要使用unregisterReceiver()方法注销BroadcastReceiver。这是为了避免内存泄漏。例如,你可以在Activity的onDestroy()方法中注销BroadcastReceiver:
unregisterReceiver(myBroadcastReceiver);
通过以上步骤,你可以在Android应用程序中动态注册并接收广播。请注意,动态注册的BroadcastReceiver只会在应用程序运行期间有效,当应用程序退出或用户切换到其他应用程序时,该Receiver会被注销。如果需要持续接收广播,可以考虑使用静态注册方式。
6,完整的动态注册参考代码:
在Android中,你可以使用registerReceiver()方法来动态注册一个BroadcastReceiver。以下是一个示例:
首先,定义一个BroadcastReceiver类:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理接收到广播的逻辑
// 可以在这里根据intent的内容进行相应的处理
}
}
然后在你的Activity或Service中动态注册广播:
public class MyActivity extends AppCompatActivity {
private MyBroadcastReceiver myBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化BroadcastReceiver
myBroadcastReceiver = new MyBroadcastReceiver();
// 注册广播
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例
registerReceiver(myBroadcastReceiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在Activity销毁时,需要解注册广播,避免内存泄漏
unregisterReceiver(myBroadcastReceiver);
}
}
以上代码会在Activity的onCreate方法中注册了一个名为"android.net.conn.CONNECTIVITY_CHANGE"的广播,当网络连接发生变化时,系统会发出这个广播,我们的MyBroadcastReceiver会接收到这个广播并在onReceive()方法中进行处理。同时,在Activity的onDestroy()方法中,我们通过unregisterReceiver()解注册了广播接收器,避免内存泄漏。
3,静态注册broadcast
在Android中,静态注册广播(BroadcastReceiver)需要将接收器(BroadcastReceiver)在应用程序的 AndroidManifest.xml 文件中进行声明,无需在运行时注册。以下是一个静态注册广播的示例代码:
1,在 AndroidManifest.xml 文件中添加 标签,指定要接收的广播的 Action 和与之关联的 BroadcastReceiver 类。例如,以下代码将注册一个 BroadcastReceiver,以接收网络连接变化(CONNECTIVITY_CHANGE)的广播:
<manifest ... >
<application ... >
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
...
</application>
</manifest>
```,2,在你的应用程序代码中定义 MyBroadcastReceiver 类,并实现 onReceive() 方法来处理接收到的广播数据。例如:
```cpp
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理接收到广播的逻辑
// 可以在这里根据 intent 的内容进行相应的处理
}
}
当网络连接发生变化时,系统会发出 “android.net.conn.CONNECTIVITY_CHANGE” 广播,你的应用程序中的 MyBroadcastReceiver 类将会接收到该广播并在 onReceive() 方法中进行处理。
注意:在程序未运行的情况下就可以接收到广播。
4,发送自定义广播
在Android中,你可以通过发送自定义的广播来传递自定义的数据。以下是一个示例,演示了如何发送和接收一个自定义广播:
1,创建一个自定义的广播Intent:
public class CustomBroadcastIntent {
public static final String CUSTOM_ACTION = "com.example.app.CUSTOM_ACTION";
}
2,在发送广播的代码中,创建一个新的Intent对象,设置其Action为自定义Action,并添加需要传递的数据。然后使用sendBroadcast()方法发送广播。
Intent intent = new Intent();
intent.setAction(CustomBroadcastIntent.CUSTOM_ACTION);
intent.putExtra("custom_data", "This is custom data");
sendBroadcast(intent);
sendBroadcast是Context的方法。
3,创建一个BroadcastReceiver类,用于接收自定义广播并处理接收到的数据。在该类中,你需要重写onReceive()方法,并在该方法中处理接收到的广播数据。
public class CustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals(CustomBroadcastIntent.CUSTOM_ACTION)) {
String customData = intent.getStringExtra("custom_data");
// 处理接收到的自定义数据
}
}
}
4,在AndroidManifest.xml文件中注册BroadcastReceiver,以便应用程序能够接收到自定义广播。
<manifest ... >
<application ... >
<receiver android:name=".CustomBroadcastReceiver" >
<intent-filter>
<action android:name="com.example.app.CUSTOM_ACTION" />
</intent-filter>
</receiver>
...
</application>
</manifest>
现在,当发送广播的代码被执行时,自定义广播将被发送到注册了相应Action的BroadcastReceiver。在BroadcastReceiver的onReceive()方法中,你可以获取到自定义的数据并进行处理。
5,发送有序广播
在Android中,你可以使用sendOrderedBroadcast()方法来发送有序广播。有序广播的接收器会按照优先级顺序进行回调。如果某个接收器返回true,则传递会停止,不会传递给其他接收器。下面是一个发送有序广播的参考代码例子:
// 创建一个广播Intent
Intent intent = new Intent(this, MyBroadcastReceiver.class);
// 添加一个附加数据
intent.putExtra("extra_data", "This is extra data");
// 发送有序广播
sendOrderedBroadcast(intent, null);
在这个例子中,MyBroadcastReceiver是你自己定义的BroadcastReceiver类。你可以在该类中重写onReceive()方法来处理接收到的广播数据。在这个例子中,我们向广播Intent添加了一个附加数据,可以在接收到广播时从Intent中获取到这个数据。
你可以在onReceive()方法中根据需要处理接收到的广播数据。如果你需要让广播继续传递给其他接收器,可以返回false,否则返回true来停止广播的传递。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理接收到的广播数据
String extraData = intent.getStringExtra("extra_data");
// 继续传递广播给其他接收器
boolean result = false; // 可以根据需要修改这个值
abortBroadcast(); // 停止广播的传递
}
}
在这个例子中,我们在onReceive()方法中获取了附加数据,并返回了false来继续传递广播给其他接收器。如果你不想让广播继续传递,可以将result变量设置为true并调用abortBroadcast()方法来停止广播的传递。
如何设置有序广播的优先级?
在Android中,你可以通过在BroadcastReceiver的AndroidManifest.xml文件中设置android:priority属性来设置有序广播的优先级。优先级值越高,广播接收器的优先级就越高。当广播被发送时,系统会按照优先级顺序回调广播接收器。
以下是一个示例,展示了如何在AndroidManifest.xml中设置BroadcastReceiver的优先级:
<receiver android:name=".MyBroadcastReceiver" android:priority="100">
<intent-filter>
<action android:name="com.example.app.MY_ACTION" />
</intent-filter>
</receiver>
在这个示例中,MyBroadcastReceiver的优先级被设置为100。如果其他BroadcastReceiver也有监听相同的Action,那么它们的优先级会低于MyBroadcastReceiver。你可以根据需要设置不同的优先级值。
需要注意的是,虽然可以通过设置优先级来控制广播的传递顺序,但建议谨慎使用,以避免滥用导致系统性能问题。在大多数情况下,最好使用普通广播而不是有序广播。
6,使用本地广播
在 Android 中,你可以使用本地广播(Local Broadcasts)来发送和接收广播消息。本地广播是一种仅限于当前应用程序的广播机制,它不会像全局广播一样广播到整个系统。下面是一个使用本地广播的参考代码例子:
LocalBroadcastManager 是 Android 中用于处理本地广播的类。它可以帮助你在应用程序内部更安全地发送和接收广播。下面是一个使用 LocalBroadcastManager 的参考例子:
1,创建一个广播类,例如 MyBroadcast:
public class MyBroadcast {
public static final String ACTION_NAME = "com.example.MY_ACTION";
public static final String EXTRA_MESSAGE = "message";
}
2,创建一个广播接收器类,例如 MyBroadcastReceiver:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import androidx.swiperefresh.widget.SwipeRefreshLayout;
import android.util.Log;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(MyBroadcast.ExtraMessage);
Log.d("MyBroadcastReceiver", "Received message: " + message);
// 在这里处理接收到广播的逻辑
}
}
3,在你的 Activity 或 Fragment 中使用 LocalBroadcastManager 发送广播:
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.swiperefresh.widget.SwipeRefreshLayout;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private LocalBroadcastManager localBroadcastManager;
private MyBroadcastReceiver myBroadcastReceiver;
private Button sendBroadcastButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
myBroadcastReceiver = new MyBroadcastReceiver();
sendBroadcastButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
localBroadcastManager.sendBroadcast();
}
});
// 注册广播
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 以网络变化为例
localBroadcastManager.registerReceiver(myBroadcastReceiver, filter);
}
}
注意:本地广播无法通过静态方式注册来接收广播。