《你的第一行Android代码》菜鸡的自学日记-第十六天

一、自定义广播

1.有序广播

基于前面的标准广播,再新建一个 BroadcastTest2 项目(new Project)。在新建的项目下定义一个广播接收器,来接受标准广播中的自定义广播。新建 AnotherBroadcastReceiver ,代码:

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

修改 AndroidMainfest.xml 中的代码:

<receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">

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

        </receiver>

回到模拟器上,点击 button,会弹出两次提示信息:

手机运行效果 手机运行效果

这样就证明了我们应用程序的广播可以被其他程序所接收。

接下来是有序广播。

修改 BroadcastTest 中 MainActivity 的代码:

Button button = (Button) findViewById(R.id.button_l);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new
                        Intent("com.example.broadcasttest.MY_BROADCAST");
                        
                sendOrderedBroadcast(intent,null);
            }
        });

此处 sendOrderedBroadcast()方法接收两个参数,第一个是 Intent,第二个是权限相关的字符串,此处传入 null 即可。为了体现有序广播的特点,我们将修改 AndroidMainfest.xml 中的代码:

 <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <!-- android:priority 属性用于给广播器设置优先级,此处优先级设置为100 -->
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

以及 MyBroadcastReceive 中的代码:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        
  //    abortBroadcast()方法表示将这条广播截断,后面的广播接收器将无法接收这条广播
        abortBroadcast();
    }
}

重新运行程序,点击 button ,只有 MyBroadcastReceiver 的 Toast 信息能够弹出。

二、本地广播

1.本地广播

使用本地广播机制发出的广播只能在应用程序的内部传递,广播接收器也只能接收来自本程序发出的广播。本地广播使用 LocalBroadcastManager 来管理广播,并提供了发送广播和注册广播接收器的方法。

优点:
□ 广播不会离开应用程序,不用担心机密数据泄露
□ 其他程序的广播无法发送到应用程序内部,不会存在安全漏洞的隐患
□ 比系统全局广播更加高效

修改 MainAcitivity 中的代码:

public class MainActivity extends AppCompatActivity {

    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_l);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new
                        Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
                //发送本地广播
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);
    }

    //动态注册的广播接收器一定都要取消注册
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
        //注册本地广播接收器
    }

    class LocalReceiver extends BroadcastReceiver {

        public void onReceive(Context context,Intent intent){
            Toast.makeText(context,"receive local broadcast",Toast.LENGTH_SHORT).show();
        }
    }
}

点击 button 会弹出 Toast 信息,但 BroadcastTest2 却无法接收到 com.example.broadcasttest.LOCAL_BROADCAST 这条广播。

小结:将基础的有序广播和本地广播的代码敲了一遍,通过实例来例假两种广播的特性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值