android发送自定义广播

发布于:2025-03-24 ⋅ 阅读:(24) ⋅ 点赞:(0)

简介

        在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中,你可以通过以下方式发送一个自定义广播:

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>,如下所示:

<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 就会被系统调用,处理这个事件。

接收方

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}

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