Android笔记(二十五)发送自定义广播和本地广播

本文深入探讨了Android中广播机制的实现方式,包括如何发送标准广播、有序广播以及本地广播,并详细解释了各自的特点与应用。通过实例代码展示每个广播类型的具体操作,帮助开发者理解并熟练运用Android的广播机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.发送标准广播
我们通过一个按钮来发送广播,广播接收器接收到广播后执行具体操作。

首先建立布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast"
/>
</LinearLayout>

然后创建一个自己的广播

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(
                        "com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }

再新建一个广播接收器来接收我们发送的广播

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received", Toast.LENGTH_SHORT).show();
    }
}

最后注册广播接收器

 <receiver android:name=".MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="com.example.mybroadcast. MY_BROADCAST" />
            </intent-filter>
        </receiver>

2.发送有序广播
有序广播和标准广播基本上一样,只需要修改几个地方。

  • 将发送广播的方式改为sendOrderedBroadcast(intent, null);
  • 设置广播接收器的权限intent-filter android:priority=”100”
  • 广播优先级高的权限可以终止广播abortBroadcast();

3.本地广播机制
为了能够简单地解决广播的安全性问题, Android 引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。

另外还有一点需要说明,本地广播是无法通过静态注册的方式来接收的。

public class MainActivity extends ActionBarActivity {

    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(
                        "com.example.mybroadcast.MY_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.mybroadcast.MY_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }

    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast",
                    Toast.LENGTH_SHORT).show();
        }
    }
<think>好的,我需要解决用户关于Android 7.1 RK3288系统中插入USB设备时触发的广播名称的问题。首先,用户提到系统版本是Android 7.1,芯片是RK3288,所以需要确认这个特定环境下USB设备的广播行为。 根据我的知识,Android系统中USB设备的插拔通常会触发系统广播。常见的广播包括`ACTION_USB_DEVICE_ATTACHED``ACTION_USB_ACCESSORY_ATTACHED`。不过,不同版本的Android可能会有差异,特别是在定制系统如RK3288上,厂商可能有修改。 接下来,我需要查阅相关资料。用户提供的引用中有提到RK3399RK3288的调试笔记,以及Android官方文档。引用[1]提到触摸屏的调试,引用[3]涉及dts配置,可能不直接相关。而引用[2]讨论OTG功能导致设备不休眠的问题,虽然没有直接回答广播名称,但说明USB设备插入会触发系统行为,可能需要注册广播接收器。 根据Android官方文档,当USB设备连接时,系统会发送`android.hardware.usb.action.USB_DEVICE_ATTACHED`广播。但需要设备支持USB Host模式,并且应用需要在清单文件中声明intent-filter,或者动态注册接收器。对于RK3288这类定制系统,可能存在厂商特定的广播,但通常遵循标准行为。 不过,用户的问题特别提到RK3288Android 7.1,是否有特殊处理?可能需要查看Rockchip的文档或内核配置。例如,引用[3]中的dts配置,可能涉及硬件相关的设置,但广播名称一般由Android框架决定,而非内核。 另外,实际测试方法:在应用中注册广播接收器,监听常见的USB相关action,然后插入USB设备查看日志。或者检查系统日志(logcat)当插入USB设备时输出的广播信息。 总结,标准情况下,广播应为`android.hardware.usb.action.USB_DEVICE_ATTACHED`,但需确认是否有厂商自定义广播,或是否需要权限声明。同时,应用需要声明USB权限或在清单中注册接收器。</think>在Android 7.1 RK3288系统中,插入USB设备时会触发以下系统广播: 1. **标准USB设备插入广播** 系统默认会发送$android.hardware.usb.action.USB\_DEVICE\_ATTACHED$广播[^1]。该广播需要配合USB设备权限声明使用: ```xml <!-- AndroidManifest.xml --> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/> ``` 2. **Rockchip平台特有行为** 在RK3288等定制平台上,可能额外触发$android.intent.action.MEDIA\_MOUNTED$广播(适用于存储类设备),但需注意不同USB设备类型(如HID、U盘、OTG设备)可能触发不同的广播[^3]。 3. **广播接收建议** 建议通过动态注册广播接收器捕获实时事件: ```java // Java代码示例 IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); registerReceiver(usbReceiver, filter); ``` 可通过以下命令实时观察广播: ```bash adb logcat | grep "BroadcastQueue" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值