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());   //进入画中画       }       }    }   } } }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在ASP.NET Core 中使用 .NET Aspire 消息传递组件

前言 云原生应用程序通常需要可扩展的消息传递解决方案&#xff0c;以提供消息队列、主题和订阅等功能。.NET Aspire 组件简化了连接到各种消息传递提供程序&#xff08;例如 Azure 服务总线&#xff09;的过程。在本教程中&#xff0c;小编将为大家介绍如何创建一个 ASP.NET …

PLC通过RS232转PROFINET与电子分析天平秤通讯案例

本案例是通过用兴达易控的XD-PNR200型RS232转Profinet网关连接电子分析天平秤与PLC通讯的配置案例&#xff0c;用到设备为西门子S7-1200PLC&#xff0c;RS232转Profinet网关&#xff0c;电子分析天平秤。 打开博图&#xff0c;添加PLC&#xff1b;本案例使用的是1200PLC。 添加…

『接口测试干货』| Newman+Postman接口自动化测试完整过程

『接口测试干货』| NewmanPostman接口自动化测试完整过程 1 Newman简介2 如何安装Newman&#xff1f;2.1 安装NodeJs2.2 安装Newman2.2 解决Newman不是内部命令 3 Newman使用3.1 Newman如何运行集合&#xff1f;3.2 如何查看帮助文档&#xff1f;3.3 环境变量设置3.4 关于全局变…

微信小程序制作

如果你也想搭建一个小程序&#xff0c;但不知道如何入手&#xff0c;那么今天我就教你如何使用第三方制作平台&#xff0c;在短短三十分钟内搭建一个小程序。 一、登录小程序制作平台 首先&#xff0c;登录到小程序制作平台的官方网站或应用程序&#xff0c;进入后台管理系统。…

【Oracle OCP考试】1z0-082(4)

1.Which two statements are true about the PMON background process? A. It rolls back transactions when a process fails&#xff08;当进程失败时&#xff0c;它回滚事务&#xff09; B. It registers database services with all local and remote listeners known to…

文章解读与仿真程序复现思路——电网技术 EI\CSCD\北大核心《考虑5G基站储能可调度容量的有源配电网协同优化调度方法》

这篇文章的标题涉及到以下关键概念&#xff1a; 5G基站&#xff1a; 提到了5G基站&#xff0c;这表明文章的焦点可能是与第五代移动通信技术相关的内容。5G技术对于提高通信速度、降低延迟以及支持大规模连接等方面有显著的改进&#xff0c;因此对于基站的电力需求和供应可能存…

2023年ESG投资研究报告

第一章 ESG投资概况 1.1 定义 ESG投资&#xff0c;亦称负责任投资&#xff0c;是一种融合环境&#xff08;Environment&#xff09;、社会&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;考量的投资方法&#xff0c;旨在通过综合这些因素来优化投资…

美国汽车零部件巨头 AutoZone 遭遇网络攻击

Security Affairs 网站披露&#xff0c;美国汽车配件零售商巨头 AutoZone 称其成为了 Clop MOVEit 文件传输网络攻击的受害者&#xff0c;导致大量数据泄露。 AutoZone 是美国最大的汽车零配件售后市场经销商之一&#xff0c;在美国、墨西哥、波多黎各、巴西和美属维尔京群岛经…

算法-技巧-简单-只出现一次的数字、多数元素

记录一下算法题的学习10 只出现一次的数字 leetcode题目&#xff1a;给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且…

「Whale 帷幄」连续入选科技榜单,AGI 冲击波正在加速行业洗牌

以 AGI 为底座&#xff0c;品牌 MarTech 正在经历一场前所未有的深度变革。 近日&#xff0c;弯弓研究院发布「中国 MarTech 500 强榜单」&#xff0c;以 2023 中国营销技术&#xff08;MarTech&#xff09;生态为研究对象&#xff0c;洞察行业现象与未来趋势。作为品牌数字化…

AMEYA360:蔡司新能源汽车解决方案驱动产业未来

电动化正在重塑中国汽车工业。自中国汽车工业开始发展以来&#xff0c;在电动化和智能化的浪潮推动下&#xff0c;汽车行业从未面临着如此巨大的变革。得益于中国汽车产业尤其是新能源车过去十余年的激流勇进&#xff0c;消费者对新能源汽车的接受度也在发生转变。新能源汽车市…

2016年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

Section IUse of English Directions: Read the following text.Choose the best word(s) for each numbered blank and mark A&#xff0c;B,Cor D on the ANSWER SHEET.(10 points)   Happy people work differently.They’re more productive&#xff0c;more creative&am…

前后端性能优化实践(含Java代码部分、数据库部分、React前端部分)

最近的一个大屏报表统计的接口查询速度很慢&#xff0c;耗时近一分钟左右&#xff0c;数据量级只是700万左右&#xff0c;但很慢&#xff0c;最后优化到4秒左右&#xff0c;客户还能接受&#xff0c;但其实还可以在优化&#xff0c;先这样吧&#xff0c;简单记录下。这次主要优…

App Inventor 2 文本转数字

App Inventor 2 是弱语言类型&#xff0c;文本和数字之间不用刻意去转换&#xff0c;之间赋值就可以了。文本赋值给数字变量如下&#xff1a; 运行结果&#xff1a;124 注意&#xff1a;数字变量初始化的时候要给一个数字的初始值&#xff0c;表明它是数字。 如果文本中含有非…

java与c++中的分支语句switch的不同

java中的switch后可用字符串,而C只能用字符和数字 switch(suffix){case "js":contentType"text/javascript";break;case "css":contentType"text/css";break;}c switch (x){case 0:case 1:case 2:rth 3;break;case 3:case 4:case 5:r…

系列三、事务

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

关于进制的转化

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

<蓝桥杯软件赛>零基础备赛20周--第7周--栈和二叉树

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

VMware共享文件夹不能放mysql的数据

概要 使用VMware搭建了一个虚拟机&#xff0c;准备做数据库服务器。服务器是linux系统&#xff0c;安装了mysql和redis。为了数据安全&#xff0c;准备将mysql的数据文件放到共享文件夹中&#xff0c;尝试多次后都没成功。问题可能是共享文件夹中的文件的拥有者都是root&#…

MFC所有控件介绍及基本使用

一、前言 本篇文档介绍了MFC控件的基本使用&#xff0c;同时提供了关于MFC控件使用的工程代码&#xff0c;程序界面如下图&#xff0c;有兴趣的可以到文档最后的链接处进行下载。 二、控件介绍 2.1 Button &#xff08;按钮&#xff09; 2.2 CheckBox&#xff08;复选框&am…