欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > android发送自定义广播

android发送自定义广播

2025/4/2 4:30:56 来源:https://blog.csdn.net/m0_74225871/article/details/140155858  浏览:    关键词: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中,你可以通过以下方式发送一个自定义广播:

public class SenderActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sender);Button sendButton = findViewById(R.id.send_button);sendButton.setOnClickListener(new View.OnClickListener() {@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_receiver);broadcastReceiver = new BroadcastReceiver() {@Overridepublic 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);}@Overrideprotected 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 上一次保存的实例状态。*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_receiver); // 设置 Activity 的布局文件。/*** 创建 BroadcastReceiver 并重写其 onReceive 方法。* onReceive 方法在 BroadcastReceiver 接收到匹配的 Intent 时被调用。*/broadcastReceiver = new BroadcastReceiver() {@Overridepublic 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,避免内存泄漏。*/@Overrideprotected 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}

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

 

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词