导航:首页 > 操作系统 > android程序退出广播

android程序退出广播

发布时间:2025-09-30 12:01:35

‘壹’ 注册广播有几种方式,这些方式有何优缺点请谈谈android引入广播机制的用意。

android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
具体实现在Manifest的application中添加:上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为:
Intent i = new Intent(“android.intent.action.BOOT_COMPLETED”);
sendBroadcast(i);
这样,广播就发出去了,然后是接收。
接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下:
protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(“android.intent.action.BOOT_COMPLETED”)) {
//Do something
}
}
};
第二种方式,直接在代码中实现,但需要手动注册注销,实现如下:
IntentFilter filter = new IntentFilter();
filter.addAction(“android.intent.action.BOOT_COMPLETED”);
registerReceiver(mEvtReceiver, filter); //这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver,
最后在程序的onDestroy中要注销广播,实现如下:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}

‘贰’ android蓝牙BLE(三) —— 广播

​ 在蓝牙开发中,有些情况是不需要连接的,只要外设广播自己的数据即可,例如苹果的 ibeacon 。自 Android 5.0 更新蓝牙API后,手机可以作为外设广播数据。

广播包有两种:

其中 广播包是每个外设都必须广播的,而响应包是可选的 。每个广播包的长度必须是 31个字节 ,如果不到 31个字节 ,则剩下的全用 0 填充 补全,这部分的数据是无效的

广播包中包含若干个广播数据单元,广播数据单元也称为 AD Structure 。

广播数据单元 = 长度值Length + AD type + AD Data。

长度值 Length 只占 一个字节 ,并且位于广播数据单元的 第一个字节

概念的东西有些抽象,先看看下面的广播报文:

​ 0x代表这串字符串是十六进制的字符串。 两位十六进制数代表一个字节 。因为两个字符组成的十六进制字符串最大为 FF ,即255,而Java中byte类型的取值范围是-128到127,刚好可以表示一个255的大小。所以两个十六进制的字符串表示一个字节。

​ 继续查看报文内容,开始读取第一个广播数据单元。读取 第一个 字节: 0x07 ,转换为十进制就是7,即表示后面的7个字节是这个广播数据单元的数据内容。超过这7个字节的数据内容后,表示是一个新的广播数据单元。

​ 而第二个广播数据单元,第一个字节的值是 0x16 ,转换为十进制就是22,表示后面22个字节为第二个广播数据单元。

​ 在广播数据单元的 数据部分 中, 第一个字节 代表 数据类型 (AD type),决定数据部分表示的是什么数据。(即广播数据单元第二个字节为AD type)

AD Type 的类型如下:

​ 这bit 1~7分别代表着发送该广播的蓝牙芯片的物理连接状态。当bit的值为1时,表示支持该功能。
例:

蓝牙广播的数据格式大致讲了一下,有助于下面的广播操作的理解。

先看看广播设置( AdvertiseSettings )如何定义:

(1)、通过 AdvertiseSettings.Builder#setAdvertiseMode() 设置广播模式。其中有3种模式:

(2)、通过 AdvertiseSettings.Builder#setAdvertiseMode() 设置广播发射功率。共有4种功率模式:

(3)、通过 AdvertiseSettings.Builder#setTimeout() 设置持续广播的时间,单位为毫秒。最多180000毫秒。当值为0则无时间限制,持续广播,除非调用 BluetoothLeAdvertiser#stopAdvertising() 停止广播。

(4)、通过 AdvertiseSettings.Builder#setConnectable() 设置该广播是否可以连接的。

之前说过,外设必须广播广播包,扫描包是可选。但添加扫描包也意味着广播更多得数据,即可广播62个字节。

可见无论是广播包还是扫描包,其广播的内容都是用 AdvertiseData 类封装的。

(1)、 AdvertiseData.Builder#setIncludeDeviceName() 方法,可以设置广播包中是否包含蓝牙的名称。

(2)、 AdvertiseData.Builder#setIncludeTxPowerLevel() 方法,可以设置广播包中是否包含蓝牙的发射功率。

(3)、 AdvertiseData.Builder#addService UUID (Parcel UUID ) 方法,可以设置特定的 UUID 在广播包中。

(4)、 AdvertiseData.Builder#addServiceData(Parcel UUID ,byte[]) 方法,可以设置特定的 UUID 和其数据在广播包中。

(5)、 AdvertiseData.Builder#addManufacturerData(int,byte[]) 方法,可以设置特定厂商Id和其数据在广播包中。

​ 从 AdvertiseData.Builder 的设置中可以看出,如果一个外设需要在不连接的情况下对外广播数据,其数据可以存储在 UUID 对应的数据中,也可以存储在厂商数据中。但由于厂商ID是需要由Bluetooth SIG进行分配的,厂商间一般都将数据设置在厂商数据。

另外可以通过 BluetoothAdapter#setName() 设置广播的名称

先看一个例子,我们分别在 广播包 扫描包 中设置 AdvertiseData.Builder 的 每一种广播报文参数 ,得到一下报文内容:

(1)、Type = 0x01 表示设备LE物理连接。

(2)、Type = 0x09 表示设备的全名

(3)、Type = 0x03 表示完整的16bit UUID 。其值为0xFFF7。

(4)、Type = 0xFF 表示厂商数据。前两个字节表示厂商ID,即厂商ID为0x11。后面的为厂商数据,具体由用户自行定义。

(5)、Type = 0x16 表示16 bit UUID 的数据,所以前两个字节为 UUID ,即 UUID 为0xF117,后续为 UUID 对应的数据,具体由用户自行定义。

最后继承 AdvertiseCallback 自定义广播回调。

初始化完毕上面的对象后,就可以进行广播:

​ 广播主要是通过 BluetoothLeAdvertiser#startAdvertising() 方法实现,但在之前需要先获取 BluetoothLeAdvertiser 对象。

BluetoothLeAdvertiser 对象存在两个情况获取为Null:

所以在调用 BluetoothAdapter#getBluetoothLeAdvertiser() 前,需要先调用判断蓝牙已开启,并判断在 BluetoothAdapter 中获取的 BluetoothLeAdvertiser 是否为空(测试过某些华为手机 mBluetoothAdapter.() 为 false , 但是能发送ble广播)。

​ 与广播成对出现就是 BluetoothLeAdvertiser.stopAdvertising() 停止广播了,传入开启广播时传递的广播回调对象,即可关闭广播:

​ 虽然通过广播告知外边自身拥有这些Service,但手机自身并没有初始化Gattd的Service。导致外部的中心设备连接手机后,并不能找到对应的 GATT Service 和 获取对应的数据。

Service类型有两个级别:

创建 BluetoothGattService 时,传入两个参数: UUID 和Service类型:

​ 我们都知道Gatt中, Service 的下一级是 Characteristic , Characteristic 是最小的通信单元,通过对 Characteristic 进行读写操作来进行通信。

​ 特征属性表示该 BluetoothGattCharacteristic 拥有什么功能,即能对 BluetoothGattCharacteristic 进行什么操作。其中主要有3种:

权限属性用于配置该特征值所具有的功能。主要两种:

Characteristic 下还有 Descriptor ,初始化 BluetoothGattDescriptor 时传入: Descriptor UUID 和 权限属性

为 Service 添加 Characteristic ,为 Characteristic 添加 Descriptor :

​ 通过蓝牙管理器 mBluetoothManager 获取 Gatt Server ,用来添加 Gatt Service 。添加完 Gatt Service 后,外部中心设备连接手机时,将能获取到对应的 GATT Service 和 获取对应的数据

​ 定义 Gatt Server 回调。当中心设备连接该手机外设、修改特征值、读取特征值等情况时,会得到相应情况的回调。

最后开启广播后,用nRF连接后看到的特征值信息如下图所示:(加多了一个只能都的特征值)

android蓝牙BLE(一) —— 扫描

android蓝牙BLE(二) —— 通信

android蓝牙BLE(三) —— 广播

android蓝牙BLE(四) —— 实战

‘叁’ Android 使用广播系统解决app开机自启动问题

关注 【网罗开发】微信公众号,回复【160】便可领取。
网罗天下方法,方便你我开发 ,更多Android技术干货等待领取,所有文档会持续更新,欢迎关注一起成长!

总结一下使用ACTION_BOOT_COMPLETED的广播,解决app开机自启动的问题
1.首先在你的工程上建一个广播接受的类,继承BroadcastReceiver:

2.然后要在AndroidManifest.xml中加入权限和配置相关信息:

3.在application标签中,配置以下相关信息:

补充说明:
1.查看系统中是否安装了类似360管家的软件,为了加快开机速度,默认是关闭掉开机广播的,只需要在设置中打开即可。
2.如果监听不到广播,可以尝试同时监听广播和sd卡。
3.同时监听广播和sd卡,在application标签中,配置以下相关信息:

‘肆’ Android中“强制停止”和广播保活的一个小坑

一直以来,使用广播进行Android进程的保活就是一种常规的保活方法,本着用事实说话的原则,我做了一个实验:

我在5台不同品牌的手机上重复了相同的实验,结果一致。由此,似乎可以得出结论——广播保活不靠谱。当然如果这个实验就这么结束了,那也太短了,男人可不能短,接着看。

后来我看到了这篇文章 论Android应用进程长存的可行性 ,作者几乎介绍了所有已知的进程保活方法,让我打开眼界,不过引起我注意的其实是下面这段话:

我突然就想到,应用程序管理器中的“强制停止”功能,会不会默认添加了“STOPPED”状态呢,所以导致广播失效呢?

于是我又进行了一次实验:

以上几步实验可以表明:

至此得出的结论是:
广播保活还是比较靠谱的,毕竟一般用户不会去“强制停止”,虽然我一开始也误以为是结束其下所有进程的意思。。。

其实“强制停止”的英语是“Force Stop”,如果了解STOPPED状态的人,可能会立刻就明白这是做什么用的了。后来我网络“强制停止”的时候,也发现了有人分析过强制停止对广播的影响。不过如果没有接触过STOPPED概念的人,或者没有在开发中遇到相关的坑的人,可能很难想到“强制停止”其实并不只是杀进程,所以也就不会去网络相关的资料了,可见误解甚至是一知半解是多么的可怕。

我们做开发工作的,不但要在遇到问题的时候能够解决问题,还应该在各个方面多积累,在遇到问题的时候才能能立刻找到方向。总之一句话:多读书!!!

‘伍’ Android 第六讲 广播接收器和服务

两种方式:静态注册和动态注册
动态注册:

1)动态注册:需要定义一个继承自BroadcastReceiver类的子类,该接收器需要在Activity中的onDestroy中注销
2)静态注册:通过在AndroidManifest.xml中配置

两种广播形式:有序广播和无序广播
1)无序广播:接受标准广播的接收器将同时收到广播消息,异步执行,没有先后顺序 sendBroadCast
2)有序广播:sendOrderedBroadCast,按照一定顺序先后被接受顺序,由priority属性决定,abortBroadCast中断广播

如果只想在本应用中发送和接受广播,使用LocalBroadcastReceiver来对广播进行管理
本地广播不支持静态注册
优点 :安全高效

Service是Android中的一种组件,和Activity的级别一致,但不能自己运行,只能后台运行,和其他组件交互,服务必须注册才能使用

本地服务:服务依附在主线程中,节约资源,主线程死掉服务终止
远程服务:服务在独立进程中,灵活性好 ,占用资源高

两种服务的启动模式:
1)start方式:调用者和服务之间没有关联,调用者退出不会影响服务,startService启动服务,如果服务不存在,调用onCreat方法,然后onStartCommand被调用。stopService关闭服务,onDestroy方法被调用
2)bind方式:调用者和服务绑定,调用者退出,服务终止bindService启动服务,onCreate方法创建服务,onBind方法绑定服务,onUnbind方法解绑,onDestory在服务结束时调用

阅读全文

与android程序退出广播相关的资料

热点内容
python中导入模块 浏览:425
matlab参数优化算法 浏览:295
立即执行命令视频 浏览:365
一个切开橙子的图标是什么app 浏览:326
stm32esp8266云服务器 浏览:212
不可编程的计算器 浏览:407
如何开启连接无线网服务器 浏览:266
linuxgcc安全编译选项 浏览:619
河南游戏服务器租用云服务器 浏览:137
怎么把电脑通讯录导到安卓手机上 浏览:33
苏美尔pdf 浏览:511
php应用开发详解书籍 浏览:1006
安卓如何自动排列应用程序 浏览:809
服务器网卡有什么用处 浏览:792
xz压缩linux 浏览:970
商丘弹性云服务器 浏览:139
三种程序员要请假 浏览:734
k3门户服务器地址 浏览:249
程序员累死视频 浏览:39
单片机led数字显示 浏览:919