Android 广播学习

广播常用的分为三种,有序、无序和本地;从接收者注册角度来看分为动态和静态两种。无序广播即平常使用的广播方式,这里我并没有写demo,并且注册上只用了动态注册。

参考博客:https://blog.csdn.net/carson_ho/article/details/52973504

 一:有序广播,有序是针对广播接收者而言的

  • 广播接受者接收广播的顺序规则(同时面向静态和动态注册的广播接受者)

    1. 按照Priority属性值从大-小排序;
    2. Priority属性相同者,动态注册的广播优先;
  • 特点

    1. 接收广播按顺序接收
    2. 先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;
    3. 先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播

demo如下,定义了三个有序广播,通过设置优先级决定每个广播的先后: 

package custombroadcast.order;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

import com.example.androidpratic.R;
import com.example.androidpratic.network.PickImageFromWorld;

public class OrderBroadcastActivity extends AppCompatActivity {
    private static final String TAG = "OrderBroadcastActivity";
    private  OrderOneReceiver mOrderOneReceiver;
    private OrderTwoReceiver mOrderTwoReceiver;
    private OrderThreeReceiver mOrderThreeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_broast);
        mOrderOneReceiver = new OrderOneReceiver();
        mOrderTwoReceiver = new OrderTwoReceiver();
        mOrderThreeReceiver = new OrderThreeReceiver();

        IntentFilter intentFilter1 = new IntentFilter();
        intentFilter1.addAction("com.example.broadCast.Order");
        intentFilter1.setPriority(100);

        IntentFilter intentFilter2 = new IntentFilter();
        intentFilter2.addAction("com.example.broadCast.Order");
        intentFilter2.setPriority(98);

        IntentFilter intentFilter3 = new IntentFilter();
        intentFilter3.addAction("com.example.broadCast.Order");
        intentFilter3.setPriority(96);

        registerReceiver(mOrderOneReceiver, intentFilter1);
        registerReceiver(mOrderTwoReceiver, intentFilter2);
        registerReceiver(mOrderThreeReceiver, intentFilter3);

        sendBroad();
    }

    private void sendBroad() {
        Intent intent = new Intent("com.example.broadCast.Order");
        sendOrderedBroadcast(intent, null, new OrderFourReceiver(), null, RESULT_OK, "发送广播了", null);
        Log.d(TAG, "send broadcast");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mOrderOneReceiver);
        unregisterReceiver(mOrderTwoReceiver);
        unregisterReceiver(mOrderThreeReceiver);
    }

    class OrderOneReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String resultData = getResultData();
            Log.d(TAG, resultData);
            setResultData("OrderOne修改了数据");
//            abortBroadcast(); // 截断测试
        }
    }

    class OrderTwoReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String resultData = getResultData();
            Log.d(TAG, resultData);
            setResultData("OrderTwo修改了数据");
        }
    }

    class OrderThreeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String resultData = getResultData();
            Log.d(TAG, resultData);
        }
    }

    // 定义的一个特殊的广播接收者,在发送有序广播的时候以参数的形式传递进去
    class OrderFourReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String resultData = getResultData();
            Log.d(TAG, "最终接收:" + resultData);
        }
    }
}

 二:本地广播

  1. App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。
  2. 相比于全局广播(普通广播),App应用内广播优势体现在:安全性高 & 效率高

注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册。

 demo如下,需要提前导入本地广播依赖:

package custombroadcast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

import com.example.androidpratic.R;

public class LocalBroadCastActivity extends AppCompatActivity {
    private static final String TAG = "LocalBroadCastActivity";
    private LocalBroadCastReceiver mLocalBroadCastReceiver;
    private LocalBroadcastManager mLocalBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_local_broad_cast);
        mLocalBroadCastReceiver = new LocalBroadCastReceiver();
        IntentFilter intentFilter = new IntentFilter("com.example.LocalBroadCast");
        mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
        mLocalBroadcastManager.registerReceiver(mLocalBroadCastReceiver, intentFilter);

        Intent intent = new Intent();
        intent.setAction("com.example.LocalBroadCast");
        intent.putExtra("DATA", "发送数据");
        mLocalBroadcastManager.sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLocalBroadcastManager.unregisterReceiver(mLocalBroadCastReceiver);
    }

    class LocalBroadCastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String data = intent.getStringExtra("DATA");
            Log.d(TAG, "onReceive data: " + data);
        }
    }
}

三:安全注意点

参考博客:https://juejin.im/post/6844904115290685448

  • 优先使用则可以使用LocalBroadcastManager
    如果不需要向应用以外的组件发送广播,使用LocalBroadcastManager 效率更高(无需进行进程间通信)。本地广播可在应用中作为通用的发布/订阅事件总线,而不会产生任何系统级广播开销。
  • 优先使用上下文注册而不是清单声明
    如果有许多应用在其清单中注册接收相同的广播,可能会导致系统启动大量应用,从而对设备性能和用户体验造成严重影响。有时,Android 系统本身会强制使用上下文注册的接收器。例如,CONNECTIVITY_ACTION 广播只会传送给上下文注册的接收器。
  • 通过权限限制广播
  • 当注册接收器时,任何应用都可以向你应用的接收器发送潜在的恶意广播。
    可以通过以下三种方式限制你的应用可以接收的广播
    • 在注册广播接收器时指定权限
    • 对于清单声明的接收器,可以在清单中将 android:exported 属性设置为“false”,这样接收器就不会接收来自应用外部的广播。
    • 使用 LocalBroadcastManager 注册广播
  • 勿使用隐式 intent 广播敏感信息
    可以通过以下三种方式控制哪些应用可以接收广播
    • 可以在发送广播时指定权限
    • 可以在发送广播时使用 setPackage(String) 指定软件包
    • 可以使用 LocalBroadcastManager 发送本地广播
  • onRecive返回后即有可能被系统回收,如需做耗时操作,尽量使用goAsync()开启后台任务或JobScheduler
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值