android发送自定义广播

简介

在Android中,自定义广播(Custom Broadcasts)主要用于应用程序内部或不同应用程序之间的通信。它们是Android四大组件之一------BroadcastReceiver------的主要功能之一。自定义广播在以下场景中尤其有用:

  1. 组件间通信:应用程序的不同部分(如不同的Activity、Service或BroadcastReceiver)之间可以使用自定义广播来传递信息。例如,当一个Activity需要通知另一个Activity某个事件发生时,可以发送一个自定义广播。

  2. 系统事件监听:虽然系统提供了许多预定义的广播,如电池电量变化、网络连接状态变化等,但自定义广播允许开发者定义自己的事件,如"用户登录成功"或"下载完成"。

  3. 跨应用通信:自定义广播不仅可以用于同一应用程序内的通信,还可以让应用程序与安装在同一设备上的其他应用程序通信。例如,一个天气应用程序可以发送一个广播来通知用户当前的天气状况,而另一个应用程序可以监听并响应这些广播,以显示相应的信息或图标。

  4. 异步任务通知:自定义广播可以用于通知应用程序的UI线程异步任务的完成情况。例如,一个后台服务可能正在下载数据,一旦下载完成,它可以发送一个自定义广播来通知UI更新显示。

  5. 资源管理:在资源有限的移动设备上,通过发送自定义广播来控制资源的使用,比如在某个特定时刻限制应用程序的网络访问,可以有助于提高整个系统的性能和响应性。

  6. 简化架构:自定义广播可以帮助构建更松散耦合的应用程序架构。组件之间不需要直接相互引用,而是通过发送和接收广播来进行通信,这使得代码更容易维护和扩展。

发送自定义广播的基本流程包括创建一个Intent对象,设置该对象的动作(action),并使用ContextsendBroadcast()方法发送。接收广播则需要注册一个BroadcastReceiver,这可以通过在代码中动态注册或在AndroidManifest.xml中静态声明来完成。

自定义广播是Android开发者工具箱中的一个强大工具,可以用来构建复杂、灵活且响应迅速的应用程序。然而,过度依赖广播可能会导致代码难以理解和调试,因此在设计应用程序架构时应该谨慎使用。

通义

一、组件间通信

发送广播Intent

在你的ActivityService中,你可以通过以下方式发送一个自定义广播:

java 复制代码
public class SenderActivity extends AppCompatActivity {

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

        Button sendButton = findViewById(R.id.send_button);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.SENDER_ACTIVITY.CUSTOM_EVENT");
                intent.putExtra("event_message", "Event triggered by SenderActivity!");
                sendBroadcast(intent);
            }
        });
    }
}






                                                /*代码解释*/
            



public class SenderActivity extends AppCompatActivity { // 定义一个名为 SenderActivity 的类,继承自 AppCompatActivity,这意味着它是一个可以显示界面的活动组件。

    @Override // 这个注解表示接下来的方法是重写父类(AppCompatActivity)中的方法。
    protected void onCreate(Bundle savedInstanceState) { // onCreate 方法是 Activity 生命周期的一部分,在 Activity 被创建时调用。
        super.onCreate(savedInstanceState); // 调用父类的 onCreate 方法,执行初始化操作,如恢复保存的实例状态。
        setContentView(R.layout.activity_sender); // 设置此 Activity 使用的布局文件。在这个例子中,使用的布局文件是 activity_sender.xml。

        Button sendButton = findViewById(R.id.send_button); // 通过 findViewById 方法找到布局文件中 id 为 send_button 的 Button 控件。
        sendButton.setOnClickListener(new View.OnClickListener() { // 为 Button 设置一个点击监听器。
            @Override // 表示重写 View.OnClickListener 接口中的 onClick 方法。
            public void onClick(View v) { // 当 Button 被点击时,这个方法会被调用。
                Intent intent = new Intent("com.example.SENDER_ACTIVITY.CUSTOM_EVENT"); // 创建一个新的 Intent 对象,指定一个自定义的动作字符串。这将被用来发送广播。
                intent.putExtra("event_message", "Event triggered by SenderActivity!"); // 向 Intent 中添加额外的数据,键为 "event_message",值为 "Event triggered by SenderActivity!"。
                sendBroadcast(intent); // 发送一个广播,所有注册了接收 "com.example.SENDER_ACTIVITY.CUSTOM_EVENT" 动作的广播接收器都会收到这个 Intent。
            }
        });
    }
}

如果你的应用中有广播接收器需要接收这个自定义事件,你可以在 AndroidManifest.xml 文件中为该接收器声明对应的 <intent-filter>,如下所示:

html 复制代码
<receiver android:name=".ReceiverActivity"
            android:enabled="true"
            android:exported="true">
    <intent-filter>
        <action android:name="com.example.SENDER_ACTIVITY.CUSTOM_EVENT"/>
    </intent-filter>
</receiver>

这样,每当你的应用广播一个动作为 com.example.SENDER_ACTIVITY.CUSTOM_EVENT 的 Intent 时,ReceiverActivity 就会被系统调用,处理这个事件。

接收方

java 复制代码
public class ReceiverActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;

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

        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = intent.getStringExtra("event_message");
                Toast.makeText(ReceiverActivity.this, message, Toast.LENGTH_SHORT).show();
            }
        };

        IntentFilter filter = new IntentFilter("com.example.SENDER_ACTIVITY.CUSTOM_EVENT");
        registerReceiver(broadcastReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadcastReceiver);
    }
}



                                                        /*代码解释*/



/**
 * ReceiverActivity 类是用于接收自定义广播的 Activity。
 * 它通过注册一个 BroadcastReceiver 来监听特定的动作 (ACTION),
 * 在本例中是 "com.example.SENDER_ACTIVITY.CUSTOM_EVENT"。
 */
public class ReceiverActivity extends AppCompatActivity {

    /**
     * broadcastReceiver 是一个 BroadcastReceiver 实例,用于接收广播。
     * 当接收到匹配的 Intent 时,会调用其 onReceive 方法。
     */
    private BroadcastReceiver broadcastReceiver;

    /**
     * onCreate 方法是 Activity 生命周期的一部分,在 Activity 启动时被调用。
     * 这里设置布局并注册 BroadcastReceiver。
     *
     * @param savedInstanceState 上一次保存的实例状态。
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receiver); // 设置 Activity 的布局文件。

        /**
         * 创建 BroadcastReceiver 并重写其 onReceive 方法。
         * onReceive 方法在 BroadcastReceiver 接收到匹配的 Intent 时被调用。
         */
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                /**
                 * 从 Intent 中获取额外的数据,这里是 "event_message" 键对应的值。
                 * 然后显示一个 Toast 提示框来展示接收到的消息。
                 */
                String message = intent.getStringExtra("event_message");
                Toast.makeText(ReceiverActivity.this, message, Toast.LENGTH_SHORT).show();
            }
        };

        /**
         * 创建一个 IntentFilter 并指定要监听的 Intent 动作。
         * 在这里,我们监听 "com.example.SENDER_ACTIVITY.CUSTOM_EVENT" 动作。
         */
        IntentFilter filter = new IntentFilter("com.example.SENDER_ACTIVITY.CUSTOM_EVENT");

        /**
         * 使用 registerReceiver 方法注册 BroadcastReceiver 和 IntentFilter。
         * 这样,当系统广播一个包含 "com.example.SENDER_ACTIVITY.CUSTOM_EVENT" 动作的 Intent 时,
         * 我们的 BroadcastReceiver 将被调用。
         */
        registerReceiver(broadcastReceiver, filter);
    }

    /**
     * onDestroy 方法是 Activity 生命周期的一部分,在 Activity 被销毁前调用。
     * 这里我们取消注册 BroadcastReceiver,避免内存泄漏。
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * 使用 unregisterReceiver 方法取消注册 BroadcastReceiver。
         * 这是必要的,否则 BroadcastReceiver 会继续接收广播,即使 Activity 已经不再使用它。
         */
        unregisterReceiver(broadcastReceiver);
    }
}

二、系统事件监听

- 自定义广播通知登录状态

LoginService.java

复制代码
 

Java

复制代码
1public class LoginService extends Service {
2
3    @Override
4    public int onStartCommand(Intent intent, int flags, int startId) {
5        if (intent.getAction().equals("com.example.LOGIN")) {
6            // 模拟登录逻辑
7            boolean loginSuccess = true; // 假设登录总是成功
8
9            Intent loginResultIntent = new Intent("com.example.LOGIN_RESULT");
10            loginResultIntent.putExtra("login_success", loginSuccess);
11            sendBroadcast(loginResultIntent);
12        }
13        return START_NOT_STICKY;
14    }
15}

示例 3:跨应用通信 - 发送天气信息

WeatherApp (发送方)

复制代码
 

Java

复制代码
1public class WeatherService extends Service {
2    @Override
3    public int onStartCommand(Intent intent, int flags, int startId) {
4        Intent weatherInfoIntent = new Intent("com.example.WEATHER_INFO");
5        weatherInfoIntent.putExtra("weather", "Sunny");
6        sendBroadcast(weatherInfoIntent);
7        return START_NOT_STICKY;
8    }
9}

OtherApp (接收方)

复制代码
 

Java

复制代码
1public class WeatherInfoReceiver extends BroadcastReceiver {
2    @Override
3    public void onReceive(Context context, Intent intent) {
4        if ("com.example.WEATHER_INFO".equals(intent.getAction())) {
5            String weather = intent.getStringExtra("weather");
6            Log.d("WeatherInfo", "Weather: " + weather);
7        }
8    }
9}

示例 4:异步任务通知 - 下载完成通知

DownloadService.java

Java

复制代码
1public class DownloadService extends Service {
2    @Override
3    public int onStartCommand(Intent intent, int flags, int startId) {
4        // 模拟下载过程
5        try {
6            Thread.sleep(3000);
7        } catch (InterruptedException e) {
8            e.printStackTrace();
9        }
10
11        Intent downloadCompleteIntent = new Intent("com.example.DOWNLOAD_COMPLETE");
12        LocalBroadcastManager.getInstance(this).sendBroadcast(downloadCompleteIntent);
13        return START_STICKY;
14    }
15}

MainActivity.java

复制代码
 

Java

复制代码
1public class MainActivity extends AppCompatActivity {
2    @Override
3    protected void onCreate(Bundle savedInstanceState) {
4        super.onCreate(savedInstanceState);
5        setContentView(R.layout.activity_main);
6
7        BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
8            @Override
9            public void onReceive(Context context, Intent intent) {
10                if ("com.example.DOWNLOAD_COMPLETE".equals(intent.getAction())) {
11                    Toast.makeText(MainActivity.this, "Download Complete!", Toast.LENGTH_SHORT).show();
12                }
13            }
14        };
15
16        LocalBroadcastManager.getInstance(this).registerReceiver(downloadReceiver, new IntentFilter("com.example.DOWNLOAD_COMPLETE"));
17    }
18
19    @Override
20    protected void onDestroy() {
21        super.onDestroy();
22        LocalBroadcastManager.getInstance(this).unregisterReceiver(downloadReceiver);
23    }
24}

示例 5:资源管理 - 控制网络访问

NetworkControlService.java

复制代码
 

Java

复制代码
1public class NetworkControlService extends Service {
2    @Override
3    public int onStartCommand(Intent intent, int flags, int startId) {
4        if (intent.getAction().equals("com.example.NETWORK_CONTROL")) {
5            boolean shouldLimit = intent.getBooleanExtra("limit_network", false);
6            // 实现网络访问控制逻辑
7        }
8        return START_STICKY;
9    }
10}

示例 6:简化架构 - 松耦合通信

NotificationService.java

复制代码
 

Java

复制代码
1public class NotificationService extends Service {
2    @Override
3    public int onStartCommand(Intent intent, int flags, int startId) {
4        if (intent.getAction().equals("com.example.NOTIFICATION")) {
5            String notificationMessage = intent.getStringExtra("notification_message");
6            // 实现通知逻辑
7        }
8        return START_STICKY;
9    }
10}

NotificationActivity.java

复制代码
 

Java

复制代码
1public class NotificationActivity extends AppCompatActivity {
2    @Override
3    protected void onCreate(Bundle savedInstanceState) {
4        super.onCreate(savedInstanceState);
5        setContentView(R.layout.activity_notification);
6
7        Button sendNotificationButton = findViewById(R.id.send_notification_button);
8        sendNotificationButton.setOnClickListener(new View.OnClickListener() {
9            @Override
10            public void onClick(View v) {
11                Intent notificationIntent = new Intent("com.example.NOTIFICATION");
12                notificationIntent.putExtra("notification_message", "Hello from NotificationActivity!");
13                sendBroadcast(notificationIntent);
14            }
15        });
16    }
17}

这些示例分别展示了自定义广播在不同场景下的应用,包括组件间通信、系统事件监听、跨应用通信、异步任务通知、资源管理和简化架构。每种场景下,自定义广播都起到了关键的通信作用,帮助构建了更灵活、解耦的应用结构。

相关推荐
咖啡の猫1 小时前
Android开发-常用布局
android·gitee
程序员老刘2 小时前
Google突然“变脸“,2026年要给全球开发者上“紧箍咒“?
android·flutter·客户端
Tans52 小时前
Androidx Lifecycle 源码阅读笔记
android·android jetpack·源码阅读
雨白2 小时前
实现双向滑动的 ScalableImageView(下)
android
峥嵘life2 小时前
Android Studio新版本编译release版本apk实现
android·ide·android studio
studyForMokey5 小时前
【Android 消息机制】Handler
android
敲代码的鱼哇5 小时前
跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
android·ios·harmonyos
翻滚丷大头鱼5 小时前
android View详解—动画
android
我是好小孩5 小时前
[Android]RecycleView的item用法
android
胖虎15 小时前
Android Studio 读取本地文件(以 ZIP 为例)
android·ide·android studio·本地文件·读取本地文件