Android定向广播

简述:

    有时候我们在使用广播的时候不希望自己发送的广播被其他应用程序接收到,那怎么办呢?我们只能定向的发送广播。本篇博文介绍一下定向广播的使用。

相关知识介绍:

    android:ssp属性
    在进入正题之前先来介绍一下android:ssp这个属性。这个是Google在API level 19加入的一个XML 属性,用于intent过滤的标签中。ssp是scheme-specific part”的缩写,意思是代表的东西都在scheme之后出现,如URI是“http://www.baidu.com”,可以分成scheme部分"http"和ssp部分"//www.baidu.com"。这里需要特别注意例子中的ssp部分是包含"//"的。ssp有以下三种相关形态:
        ① android:ssp-------精准匹配scheme后的全部内容
        ② android:sspPrefix-------匹配scheme前缀
        ③ android:sspPattern-------模式匹配

实现:

    由于广播是能够跨进程的,所以定向广播在App应用进程内部可以使用,同样在夸App(或者更准确地说是夸进程)也能够使用。

    方式一

   1、发送广播(自定义广播)

   经常说”发送广播“和”接收“,表面上看广播作为Android广播机制中的实体,实际上这一实体本身是并不是以所谓的”广播“对象存在的,而是以”意图“(Intent)去表示。所以我们自定义一个广播(模拟发送广播)

@TargetApi(Build.VERSION_CODES.KITKAT)
private void sendOritentationBroadcast() {
    Intent intent = new Intent();
    intent.setAction("mybroadcast");
    Uri data = Uri.parse("package://com.lzy.orientationbroadcast");
    intent.setData(data);
    MainActivity.this.sendBroadcast(intent);
    Toast.makeText(getApplicationContext(), "发送广播成功", Toast.LENGTH_SHORT).show();
}
    2、注册广播接收器

         ① 隐式注册(静态广播接收器)

    <receiver android:name=".InnerBrocastReceiver">
    <intent-filter >
        <action android:name="mybroadcast"/>
        <data android:scheme="package"
            android:sspPrefix="//com.lzy.orientationbroadcast"/>
    </intent-filter>
        ② 显式注册(动态广播接收器)

    @TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected void onResume() {
    super.onResume();
    InnerBrocastReceiver receiver = new InnerBrocastReceiver();
    IntentFilter pkgFilter = new IntentFilter("mybroadcast");
    pkgFilter.addDataScheme("package");
    pkgFilter.addDataSchemeSpecificPart("com.lzy.orientationbroadcast",
            PatternMatcher.PATTERN_LITERAL);
    MainActivity.this.registerReceiver(receiver,pkgFilter);
}
    3、扩展BroadcastReceiver

    public class InnerBrocastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "应用内:::接收到定向广播", Toast.LENGTH_SHORT).show();
    }
    4、测试
   我写了两个App,其中一个app负责发送广播并在应用内接收广播,另一个采用隐式注册只是负责接收广播。注意:别人反编译你的manifest.xml文件后,找到ssp格式同样可以接收到你发的广播(不安全)。

                                  

     方式二:

           这种形式更像是Broadcast组件与其他组件见得通信不再像是广播了,每次发送广播(或者叫数据)要严格制定包名和类名。这种形式是适用于自己发送的广播的形式,不适用于系统发送的广播.实现如下:

           1、发送广播的代码:

private void sendOritentationBroadcast() {
        Intent intent = new Intent();
        intent.setComponent(new           
        ComponentName(getApplicationContext(),InnerBroadcastReceiver.class));
        MainActivity.this.sendBroadcast(intent);
        Toast.makeText(getApplicationContext(), "发送广播成功", Toast.LENGTH_SHORT).show();
    }
          2、注册:
<receiver android:name=".InnerBroadcastReceiver" />
          3、扩展BroadcastReceiver

public class InnerBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "wefg", Toast.LENGTH_SHORT).show();

    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值