Android之粘性广播理解

原文:http://blog.csdn.net/weidi1989/article/details/8016688

BroadcastReceiver,作为一个广播接收者,因为android组件之间消息的传递基于intent,所以广播接收者想要接收什么类型的广播,将receiver标签下的intent-filter标签下的action标签的值置为那个广播类型即可,如

  1. <receiver android:name=".IncomingSMSReceiver">  
  2.      <intent-filter>  
  3.           <action android:name="android.intent.action.BOOT_COMPLETED"/>  
  4.           <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  5.      </intent-filter>  
  6. </receiver>  

上面这段代码其实就注册了两个广播接收的类型,系统开机启动完成时的广播和短信到来的广播(注意加上短信接受权限)都会被接收到,然后可以再onReceive()方法里面写上你想写的代码了。
额外提个事,权限问题一定要加上,现在的logcat里面Permission denied的提示都不是红色的了,改成橙色的,我还以为我这没出问题,找了半天代码的问题,结果后来还是发现权限配错了,本来想拦截拨出的电话的,结果没配权限怎么都拿不到数据啊,找了十几分钟。虽然相对前些天我找一个上午的权限问题进步多了,但是我还是这么认为,玩android权限问题都要找个十来分钟的话那就太2了。
除了在清单文件中配置以外,也可以在代码中订阅
        
  1. IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");  
  2. Receiver receiver = new Receiver();  
  3. registerReceiver(receiver, filter);  

Receiver是你自己写的继承自BroadcastReceiver的类。IntentFilter就对应着Action啦。
还有一个细节是sendBroadcast的三种发送方法。
sendBroadcast(),sendOrderedBroadcast() sendStickyBroadcast()

sendBroadcast()这个方法的广播是能够发送给所有广播接收者,按照注册的先后顺序,如果你这个时候设置了广播接收者的优先级,优先级如果恰好与注册顺序相同,则不会有任何问题,如果顺序不一样,会出leaked IntentReceiver 这样的异常,并且在前面的广播接收者不能调用abortBroadcast()方法将其终止,如果调用会出BroadcastReceiver trying to return result during a non-ordered broadcast的异常,当然,先接收到广播的receiver可以修改广播数据。


sendOrderedBroadcast()方法顾名思义就是priority的属性能起作用,并且在队列前面的receiver可以随时终止广播的发送。还有这个api能指定final的receiver,这个receiver是最后一个接收广播时间的receiver,并且一定会接收到广播事件,是不能被前面的receiver拦截的。实际做实验的情况是这样的,假设我有3个receiver依序排列,并且sendOrderedBroadcast()方法指定了一个finalReceiver,那么intent传递给这4个Receiver的顺序为Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。这个特性可以用来统计系统中能监听某种广播的Receiver的数目。


sendStickyBroadcast()字面意思是发送粘性的广播,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
下面是广播接收者的生命周期以及一些细节部分:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成

至于广播接收者接收用户的短信,实现ip拨号等功能,明白上面的话实现起来就轻而易举了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 Android ScrollView 粘性标题的效果,可以使用两种方法: 1. 使用 CoordinatorLayout 和 AppBarLayout 在布局文件中使用 CoordinatorLayout 和 AppBarLayout,并将要固定的标题放在 AppBarLayout 中的 Toolbar 中,通过设置 app:layout_scrollFlags="scroll|enterAlways|snap" 属性实现粘性标题效果。 示例代码: ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <com.google.android.material.appbar.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways|snap"> <!-- 固定的标题内容 --> </com.google.android.material.appbar.Toolbar> </com.google.android.material.appbar.AppBarLayout> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!-- 滚动内容 --> </androidx.core.widget.NestedScrollView> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 2. 使用 StickyScrollView 使用 StickyScrollView 库,将要固定的标题放在 StickyScrollView 中即可实现粘性标题效果。 示例代码: ```xml <com.github.ksoichiro.android.observablescrollview.ObservableScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:headerLayout="@layout/header_layout" app:sticky="true"> <!-- 滚动内容 --> </com.github.ksoichiro.android.observablescrollview.ObservableScrollView> ``` 注意:使用 StickyScrollView 库需要在 build.gradle 文件中添加以下依赖: ```groovy implementation 'com.github.ksoichiro:android-observablescrollview:1.6.0' ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值