Android开发从0开始(广播)

应用广播

发送标准广播的三步骤

发送标准广播:

//发送标准广播

Intent intent =new Intent("com.dongnaoedu.chapter09.standard");

sendBroadcast(intent);

定义广播接受者:

public class StanderdReceiver extends BroadcastReceiver {

public  static final String  STANDARD_ACTION="com.dongnaoedu.chapter09.standard";

//一旦收到广播就会触发onReceive的方法

 @Override

public void onReceive(Context context, Intent intent) {

if(intent!=null &&intent.getAction().equals(STANDARD_ACTION)){

Log.d("ning","收到一个标准广播");    }   }   }

开关广播接受者:

protected void onStart()

    {

        super.onStart();

        standerdReceiver = new StanderdReceiver();

        //创建一个意图过滤器,只处理STANDARD_ACTION广播

        IntentFilter filter = new IntentFilter(StanderdReceiver.STANDARD_ACTION);

        registerReceiver(standerdReceiver,filter);

    }

protected void onStop()

    {

        super.onStop();

        //注销接收器

        unregisterReceiver(standerdReceiver);

}

发送有序广播:(可截断广播abortBroadcast())

发送标准广播:

 Intent intent=new Intent(ORDER_ACTION);

 sendOrderedBroadcast(intent,null);

定义广播接受者:

    public void onReceive(Context context, Intent intent) {

        if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){

            Log.d("ning","接收器B收到一个有序广播");

        }

}

public void onReceive(Context context, Intent intent) {

if(intent!=null&&intent.getAction().equals(BoradOraderActivity.ORDER_ACTION)){

             Log.d("ning","接收器A收到一个有序广播");

        }

    }

开关广播接受者:

  protected void OnStart()

    {

        super.onStart();

        //注册广播A

        orderAReceiver = new OrderAReceiver();

        IntentFilter filterA=new IntentFilter(ORDER_ACTION);

        filterA.setPriority(3);

        registerReceiver(orderAReceiver,filterA);

        //注册广播B

        orderBReceiver = new OrderBReceiver();

        IntentFilter filterB=new IntentFilter(ORDER_ACTION);

        filterB.setPriority(6);

        registerReceiver(orderAReceiver,filterB);

    }

    protected void OnStop()

    {

        super.onStop();

        unregisterReceiver(orderAReceiver);

        unregisterReceiver(orderBReceiver);

    }

静态注册广播:(不推荐

  在AndroidManifest.xml中注册,为静态注册

   权限<uses-permission android:name="android.permission.VIBRATE"/>

注册部分:<intent-filter>

            <action android:name="com.dongnaoedu.chapter09.shock"/>

          </intent-filter>

广播定义:   public void onReceive(Context context, Intent intent) {

        if(intent!=null&&intent.getAction().equals(SHOCK_ACTION))

        {

            Log.d("ning","震动");

     Vibrator vb= (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);

            vb.vibrate(500);

        }

    }

广播发送

public void onClick(View view) {

        String fullName="com.dongnaoedu.chapter09.shock";

        Intent intent =new Intent("com.dongnaooedu.chapter09.shock");

        //指定接收路径

        ComponentName componentName=new ComponentName(this,fullName);

        //设置组件意图

        intent.setComponent(componentName);

        sendBroadcast(intent);}

系统广播

  由系统发送的广播,故注册一个广播接受者即可。

系统分钟到达广播

      protected void onStart(){

        super.onStart();

        //注册一个分钟变更的广播接收器

        timeReceiver = new TimeReceiver();

        IntentFilter filter= new IntentFilter(Intent.ACTION_TIME_TICK);

        registerReceiver(timeReceiver,filter);

    }

    protected void onStop(){

        super.onStop();

        //取消注册广播

        unregisterReceiver(timeReceiver);

}

系统网络变更广播

      protected void onStart(){

        super.onStart();

        //注册网络变更的广播接收器

        networkReceiver = new NetWorkReceiver();

        IntentFilter filter= new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");

        registerReceiver(networkReceiver,filter);

    }

    protected void onStop(){

        super.onStop();

        //取消注册广播

        unregisterReceiver(networkReceiver);}

 屏幕变更事件

 定时管理器:AlarmManager

①定义定时管理器AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {

public static final String ALARM_ACTION="com.dongnaoedu.chapter09.alarm";

private final Context mContext;

public AlarmReceiver(Context context){

        super();

        this.mContext=context; }

@Override

    public void onReceive(Context context, Intent intent) {

        if(intent!=null && intent.getAction().equals(ALARM_ACTION) )

        {  Log.d("ning","收到闹钟广播");  }   }

  //发送闹钟广播的方法

    public  void  sendAlarm()

    {   //设置意图给延时意图使用

        Intent intent= new Intent(ALARM_ACTION);

        //设置用于广播的延迟意图

        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,0,intent,PendingIntent.FLAG_IMMUTABLE);

        //从系统中拿到闹钟管理器

        AlarmManager alarmManager=(AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        //判断版本,Android6.0

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){

            alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,1000,pendingIntent);

        }else

        {

            //设置闹钟管理器(android6.0,后该方法,在灭屏不保证发送广播)

            alarmManager.set(AlarmManager.RTC_WAKEUP,1000,pendingIntent);

        }

    }

}

注册定时管理器

  public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {

    private AlarmReceiver alarmReceiver;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_alarm);

        findViewById(R.id.btn_alarm).setOnClickListener(this);

    }

    @Override

public void onClick(View view) {alarmReceiver.sendAlarm(); }

    protected void onStart(){

        super.onStart();

        alarmReceiver = new AlarmReceiver(getApplicationContext());

        IntentFilter filter=new IntentFilter(AlarmReceiver.ALARM_ACTION);

        registerReceiver(alarmReceiver,filter);

    }

    protected void onStop(){

        super.onStop();

        unregisterReceiver(alarmReceiver);

    }

}

竖屏与横屏切换

  切换时会将之前的生命周期结束,重新创建一个新的生命周期。若想不重启,则

①在AndroidManifest.xml中,给activity节点增加Android:configChanges。

②修改活动页面java代码,重写活动的onConfigurationChanged方法。

在AndroidManifest.xml中配置Android:screenOrientation=”portrait”可以指定横屏或竖屏

回到桌面与切换任务列表:

  通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS可判断是否回到桌面,任务列表是否打开。

  收到意图中reason字段,值为homekey时表示为回桌面,recentapps时为打开任务列表。

  在AndroidManifest.xml中加入android:supportsPictureInPicture="true"支持画中画权限

public class ReturnDesktopActivity extends AppCompatActivity {

    private DesktopRecevier desktopRecevier;

    @Override//在创建函数中注册画中画

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_return_desktop);

        desktopRecevier = new DesktopRecevier();

        IntentFilter filter=new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);

        registerReceiver(desktopRecevier,filter);

    }

//注销画中画

    @Override

    protected void onDestroy() {

        super.onDestroy();

        unregisterReceiver(desktopRecevier);

    }

    //进入画中画模式或退出画中画时触发

    @Override

    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {

        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);

        if(isInPictureInPictureMode){

            Log.d("ning","进入画中画模式");

        }else {

            Log.d("ning","退出画中画模式");

        }

    }

    //定义一个返回桌面的广播接收器

private class DesktopRecevier extends BoradOraderActivity{

public void onReceive(Context context, Intent intent){

if(intent!=null&&intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){

String reason=intent.getStringExtra("reason");

              if(!TextUtils.isEmpty(reason)&&(reason.equals("homekey")||reason.equals("recentapps"))){

                  //android 8.0后才有画中画判断一下

 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O&&!isInPictureInPictureMode())

  {            //创建画中画模式的参数构建器

   PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();

    Rational ratio = new Rational(10,5); //指定屏幕宽高比例

    builder.setAspectRatio(ratio);                      enterPictureInPictureMode(builder.build());   //进入画中画       }       }    }   } } }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ECharts与DataV:数据可视化的得力助手

文章目录 引言一、ECharts简介优势&#xff1a;劣势&#xff1a; 二、DataV简介优势&#xff1a;劣势&#xff1a; 三、ECharts与DataV的联系四、区别与选择五、如何选择根据需求选择技术栈考虑预算和商业考虑 结论我是将军&#xff0c;我一直都在&#xff0c;。&#xff01; 引…

关于进制的转化

二进制转十进制&#xff1a; &#x1f530; 方法一&#xff1a;二进制转十进制&#xff0c;用各数的码位与位权的乘积之和&#xff0c;说白了就是用从右到左的每个数去乘以2的幂次方&#xff08;最右边是0&#xff09;&#xff0c;然后就所有的数相加。 补充&#xff1a;位权是…

多模态常见任务介绍

视觉问答&#xff08;VQA&#xff0c; Visual Question Answer&#xff09; 目标&#xff1a;给定一个图片以及问题&#xff0c;需要理解图片的内容并基于此用自然语言回答问题。 例如&#xff0c;图像中发生什么事&#xff0c;人物穿的衣服是什么颜色&#xff0c;图像中有多…

在Windows系统上安装git-Git的过程记录

01-上git的官网下载git的windows安装版本 下载页面链接&#xff1a; https://git-scm.com/downloads 选择Standalone Installer的版本进行下载&#xff1a; 这里给大家一全git-2.43.0的百度网盘下载链接&#xff1a; https://pan.baidu.com/s/11HwNTCZmtSWj0VG2x60HIA?pwdut…

【DDS】OpenDDS配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍OpenDDS配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更…

【译】Spring 6 入参数据校验: 综合指南

原文地址&#xff1a;Spring 6 Programmatic Validator: A Comprehensive Guide 一、前言 在 Spring 6.1 中&#xff0c;有一个非常值得注意的重要改进——编程式验证器实现。Spring 长期以来一直通过注解支持声明式验证&#xff0c;而 Spring 6.1 则通过提供专用的编程式验证…

【挑战业余一周拿证】AWS 认证云从业者 - 基础(AWS Certified Cloud Practitioner- Foundational)

一、前言 二、开支记录 三、活动时间 四、活动任务 五、关注订阅号 六、如何报名 Q: 我想参加CSDN 孵化器活动&#xff0c;如何报名&#xff1f; Q: 我想正式报考AWS认证考试&#xff0c;该怎么办&#xff1f; Q: 如何领取考试券&#xff1f; Q: 本次活动考试的费用是…

功率半导体器件CV测试系统

概述 电容-电压(C-V)测量广泛用于测量半导体参数&#xff0c;尤其是MOS CAP和MOSFET结构。MOS(金属-氧化物-半导体)结构的电容是外加电压的函数&#xff0c;MOS电容随外加电压变化的曲线称之为C-V曲线&#xff08;简称C-V特性&#xff09;&#xff0c;C-V 曲线测试可以方便的确…

申请二级域名

1、登录腾讯云 腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2、进入我的域名&#xff0c;点击主域名 3、点击前往DNSPod管理 4、点击我的域名&#xff0c;然后点击主域名 5、点击添加记录&#xff0c;进行添加二级域名信息 6、添加相应二级域名信息 7、添加后需要进行验证…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

复亚智能交通无人机:智慧交通解决方案大公开

城市的现代化发展离不开高效的交通管理规划。传统的交通管理系统庞大繁琐&#xff0c;交警在执行任务时存在安全隐患。在这一背景下&#xff0c;复亚智能交通无人机应运而生&#xff0c;成为智慧交通管理中的重要组成部分。交通无人机凭借其高灵活性、低成本、高安全性等特点&a…

前装标配搭载率突破30%,数字钥匙赛道进入「纵深战」周期

在汽车智能化进程中&#xff0c;作为传统高频应用的车钥匙&#xff0c;也在加速数字化升级。同时&#xff0c;在硬件端&#xff0c;从蓝牙、NFC到UWB等多种通讯方式的叠加效应&#xff0c;也在大幅度提升数字钥匙的用户体验。 目前&#xff0c;部分市场在售车型&#xff0c;车企…

蓄电池监控技巧,节省了我80%的无效工作!

在当今社会&#xff0c;蓄电池作为能源存储和备用电源的关键组件&#xff0c;已经在各行各业中扮演着愈发重要的角色。 然而&#xff0c;蓄电池在使用过程中面临着一系列的挑战&#xff0c;包括性能衰减、安全隐患和能源效率等问题。在这种背景下&#xff0c;蓄电池监控技术应运…

系列三、事务

一、事务 1.1、概述 事务是数据库操作的基本单元&#xff0c;它是指逻辑上的一组操作&#xff0c;要么都成功&#xff0c;要么都失败。典型场景&#xff1a;转账&#xff0c;例如Jack给Rose转账1000元&#xff0c;转账成功&#xff1a;Jack账户的余额少1000元&#xff0c;Rose…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

NX二次开发UF_CSYS_create_csys 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_csys Defined in: uf_csys.h int UF_CSYS_create_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates a CSYS. 创…

算法:给出指定整数区间、期望值,得到最终结果

1&#xff0c;问题&#xff1a; 在游戏中&#xff0c;我们经常会遇到以下情况&#xff1a;打开宝箱&#xff0c;获得x个卡牌碎片。 但通常策划只会给一个既定的数值空间&#xff0c;和一个期望得到的值&#xff0c;然后让我们去随机。比如&#xff1a; 问题A&#xff1a;在1~…

用栈实现队列的功能,用队列实现栈的功能?

我们知道队列的特点是先入先出&#xff0c;栈的特点是后入先出&#xff0c;那么如何用栈实现队列的功能&#xff0c;又如何用队列实现栈的功能呢&#xff0c;且听我一一道来 我们首先来看用栈实现队列的功能&#xff0c;首先大伙儿要知道队列和栈的特点其实是“相反”&#xf…

氮化镓的晶体学湿式化学蚀刻法

引言 目前&#xff0c;大多数III族氮化物的加工都是通过干法等离子体蚀刻完成的。干法蚀刻有几个缺点&#xff0c;包括产生离子诱导损伤和难以获得激光器所需的光滑蚀刻侧壁。干法蚀刻产生的侧壁典型均方根(rms)粗糙度约为50纳米&#xff0c;虽然已经发现KOH基溶液可以蚀刻AlN…

【2023年APMCM亚太杯C题】完整代码+结果分析+论文框架

2023年APMCM亚太杯C题 完整代码结果分析论文框架第一问问题分析技术文档1 基于AHP的新能源汽车发展影响因素分析1.1 AHP模型的构建1.2 AHP模型的求解 2 基于自适应ARIMA-非线性回归模型的影响因素预测2.1 ARIMA模型的建立2.2 非线性回归模型的建立2.3 自适应混合ARIMA-非线性回…