前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android广播

android广播

作者头像
码客说
发布2019-10-22 14:09:53
1.1K0
发布2019-10-22 14:09:53
举报
文章被收录于专栏:码客

简介

android广播其实上是发布-订阅模型,发布有两种方式,订阅也有两种方式 发布的两种方式是无序方式(普通广播)有序方式(有序广播) 订阅的两种方式是静态订阅动态订阅

发布的两种方式

无序方式(普通广播)
代码语言:javascript
复制
Intent intent = new Intent("cn.psvmc.broadcast");  
sendBroadcast(intent,null);
有序方式(有序广播)
代码语言:javascript
复制
Intent intent = new Intent("cn.psvmc.broadcast");  
sendOrderedBroadcast(intent, null);

订阅的两种方式

静态订阅

静态订阅广播又叫:常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接收到,他的注册方式就是在你的应用程序中的AndroidManifast.xml进行订阅的。

定义广播的接受者

代码语言:javascript
复制
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.util.Log;  
  
/** 
 * 广播接收者 
 * 
 */  
public class MyBroadcastReceiver extends BroadcastReceiver {  
  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Log.e("Intent_Action:",intent.getAction()+"");  
    }  
  
}

AndroidManifast.xml中注册广播

无序的这样写

代码语言:javascript
复制
<receiver android:name=".MyBroadcastReceiver">  
    <intent-filter >  
        <action android:name="cn.psvmc.broadcast"/>  
    </intent-filter>  
</receiver>

有序的这样写

代码语言:javascript
复制
<receiver android:name=".MyBroadcastReceiver">  
    <intent-filter android:priority="999">  
        <action android:name="cn.psvmc.broadcast"/>  
    </intent-filter>  
</receiver>

其中android:priority="999"越大 就越早收到广播 有序广播可以终止,无序广播不能终止,终止方法如下

代码语言:javascript
复制
abortBroadcast();

文中cn.psvmc.broadcast可以随便写,只要不重复就行了

动态订阅

动态订阅广播又叫:非常驻型广播,当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume订阅广播,同时你必须在onDestory或者onPause取消广播订阅。不然会报异常,这样你的广播接收器就一个非常驻型的了。

这里面还有一个细节那就是这两种订阅方式,在发送广播的时候需要注意的是:动态注册的时候使用的是隐式intent方式的,所以在发送广播的时候需要使用隐式Intent去发送,不然是广播接收者是接收不到广播的,这一点要注意。但是静态订阅的时候,因为在AndroidMainfest.xml中订阅的,所以在发送广播的时候使用显式Intent隐式Intent都可以(当然这个只针对于我们自己定义的广播接收者),所以以防万一,我们一般都采用隐式Intent去发送广播。

上面提到了显式Intent隐式Intent,他们的区别一会在说

代码语言:javascript
复制
public class MainActivity extends Activity {
    private BroadcastReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //创建动态订阅
        IntentFilter filter = new IntentFilter("cn.psvmc.broadcast");
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //刷新UI操作
            }
        };
        //注册动态订阅
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消动态订阅
        if(receiver!=null){
            unregisterReceiver(receiver);
        }
    }
}
相关介绍

A页面跳到B页面 B页面关闭后刷新`A页面`的两种方式

代码语言:javascript
复制
1) 重写 onResume()方法。
2) 在B页面发送一个广播,在A页面注册一个接收器,接受你发送的广播,进行处理。
显式Intent & 隐式Intent

显式Intent

代码语言:javascript
复制
Intent it = new Intent(MainActivity.this,SecondActivity.class);
startActivity(it);

隐式Intent

代码语言:javascript
复制
// 隐式Intent
Intent it = new Intent();  
//设置Intent的Action属性  
it.setAction("cn.psvmc.broadcast");  
// 启动Activity  
startActivity(it);

这样由于没有指定目标Avtivity,所以AndroidManifast.xml要这样配置

代码语言:javascript
复制
<activity android:name=".SecondActivity" >                 
    <intent-filter>   
        <action  android:name = "cn.psvmc.broadcast"  />   
        <category android:name = "android.intent.category.DEFAULT"  />   
     </intent-filter>       
</activity>

广播的常用方式

一个比较常见的例子就是自动读取短信验证码/短信拦截

系统在收到短信的时候,会发送一个:android.provider.Telephony.SMS_RECEIVED这样的广播,而且这是一个有序的广播,所以我们就可以拦截了这条短信,因为系统中的短信接收者的订阅优先级不是1000最高的,所以我们可以自己定义一个短信接收者,将订阅优先级设置成1000,这样我们就可以最先获取到短信内容,然后终止广播。让系统接收不到这条短信。

示例代码

代码语言:javascript
复制
public class SortBroadcastReceiverA extends BroadcastReceiver{  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        //获取短信的相关信息,使用字段pdus  
        Object[] pdus = (Object[]) intent.getExtras().get("pdus");  
        StringBuilder content = new StringBuilder();  
        String receiveTime = "";  
        String senderNumber = "";  
        for(Object p : pdus){  
            byte[] pdu = (byte[]) p;  
            SmsMessage message = SmsMessage.createFromPdu(pdu);  
            content.append(message.getMessageBody());  
            Date date = new Date(message.getTimestampMillis());  
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            receiveTime = format.format(date);  
            senderNumber = message.getOriginatingAddress();  
        }  
          
        Log.e("Demo:","上传短信内容是:"+content.toString());  
        Log.e("Demo:","接收短信的时间是"+receiveTime);  
        Log.e("Demo:","发送短信的号码是:"+senderNumber);    
    }
}

所需权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_SMS"/>  
<uses-permission android:name="android.permission.INTERNET"/>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 发布的两种方式
    • 无序方式(普通广播)
      • 有序方式(有序广播)
      • 订阅的两种方式
        • 静态订阅
          • 动态订阅
            • 相关介绍
            • 显式Intent & 隐式Intent
        • 广播的常用方式
        相关产品与服务
        短信
        腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档