Android——发送广播(本地广播)

本文深入探讨了Android中为解决广播安全性问题而引入的本地广播机制。通过使用LocalBroadcastManager,应用程序可以实现在内部安全地发送和接收广播,避免了外部干扰。文章详细介绍了本地广播的实现代码和流程,证明了其仅限于应用程序内部传播的特点。

为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用 程序发出的广播,这样所有的安全性问题就都不存在了。

本地广播的用法并不复杂,主要就是使用了一个LocalBroadcastManager来对广播进行 管理,并提供了发送广播和注册广播接收器的方法。修改 MainActivity中的代码,如下所示:

package com.example.broadcasts_demo;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


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 = findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);//发送广播
                sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册广播接收器
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
//接受广播
    class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broacast", Toast.LENGTH_SHORT).show();
        }
    }

}

写到这很多人运行完也不知道为什么这就是个本地广播,我们借用一下上篇有序广播的项目,修改一下BroadcastTest2的项目的AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasttest2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
            //这个位置注册我们写的本地广播(原本是com.example.broadcasttest.MY_BROADCAST)
                <action android:name="com.example.broadcasttest.LOCAL_BROADCAST"/>
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

再次运行点击本地广播项目的发送广播按钮,只能接受到本地广播的信息,BroadcastTest2的信息是无法接受到的。所以证明了本地广播只能在程序内传播。

OpenCV(开源计算机视觉库)是计算机视觉和机器学习领域广泛应用的一个强大工具,它提供了丰富的图像处理、特征检测、模式识别等功能。在这个“OpenCV4.12.0 + CUDA + 扩展模块Contrib+VS2019编译库”项目中,我们将深入探讨如何在Visual Studio 2019环境下,利用CUDA技术来加速OpenCV的计算,并集成OpenCV的扩展模块Contrib。OpenCV 4.12.0是这个库的最新稳定版本,它包含了许多性能优化和新功能。例如,更新的算法、改进的接口以及对新硬件的支持。CUDA是NVIDIA提供的并行计算平台,通过GPU进行高性能计算,可以显著提升图像处理和计算机视觉任务的速度。将OpenCV与CUDA结合,可以充分利用现代GPU的并行计算能力,加快计算密集型操作,如图像金字塔构建、特征匹配和物体检测等。在编译OpenCV时,需要确保安装了CUDA Toolkit,这是CUDA编程所必需的。安装后,你需要配置OpenCV的CMake构建系统,指定CUDA支持,并设置相应的编译选项。在CMake中,你可以通过设置WITH_CUDA标志为ON来启用CUDA支持。同时,你还需要确保设置正确的CUDA版本和对应的NVIDIA驱动程序。接下来,OpenCV的扩展模块Contrib包含了更多实验性和专有功能,这些功能可能尚未被纳入OpenCV的主要库中。例如,深度学习模块(DNN)、图像超分辨率模块(SuperRes)和增强现实模块(aruco)等。要集成这些模块,你需要在CMake配置阶段设置WITH_CONTRIB标志为ON。这些额外的模块可以提供更广泛的算法选择,满足更专业或特定的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值