Android开发从0开始(广播)

news2024/10/6 8:22:37

应用广播

发送标准广播的三步骤

发送标准广播:

//发送标准广播

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.coloradmin.cn/o/1246673.html

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

相关文章

连接docker swarm和凌鲨

docker swarm相比k8s而言&#xff0c;部署和使用都要简单很多&#xff0c;比较适合中小研发团队。 通过连接docker swarm和凌鲨&#xff0c;可以让研发过程中的常用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 使用步骤 部署swarm proxy 你可以通过linksaas…

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

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

Go 语言中结构体的使用和示例

结构体&#xff08;简称struct&#xff09;用于创建不同数据类型的成员集合&#xff0c;放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中&#xff0c;但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非…

完善农业农村基础数据资源体系,加速乡村振兴

完善农业农村基础数据资源体系&#xff0c;加速乡村振兴 随着乡村振兴战略的实施&#xff0c;农业农村基础设施建设也得到了越来越多的关注。然而&#xff0c;在实施这一战略的过程中&#xff0c;我们也必须认识到&#xff0c;完善农业农村基础数据资源体系同样是十分重要的。 …

Docker Compose部署微服务项目实战讲解

一、Docker Compose简介 当需要在多个容器之间协调和管理应用程序时&#xff0c;Docker Compose是一个非常有用的工具。它允许通过一个配置文件来定义、配置和启动多个 Docker 容器&#xff0c;使得整个应用程序的部署变得更加简单和一致。以下是 Docker Compose 的一些重要概…

猿人学(非常简单三道题)

17. 天杀的http2.0 https://blog.csdn.net/weixin_44327634/article/details/123740008?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169949361816800180633940%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id169949361816800…

机器学习/sklearn 笔记:K-means,kmeans++,MiniBatchKMeans,二分Kmeans

1 K-means介绍 1.0 方法介绍 KMeans算法通过尝试将样本分成n个方差相等的组来聚类&#xff0c;该算法要求指定群集的数量。它适用于大量样本&#xff0c;并已在许多不同领域的广泛应用领域中使用。KMeans算法将一组样本分成不相交的簇&#xff0c;每个簇由簇中样本的平均值描…

全志D1芯片 MIPI屏幕TFT08006支持

屏幕简介 TFT08006官方支持的一款MIPI屏幕&#xff0c;8寸&#xff0c;分辨率800*1280。官方套装支持触控。 下载 MIPI屏幕 TFT08006 patch&#xff1a; https://www.aw-ol.com/downloads/resources/27 MIPI屏幕 TFT08006 相关资料见&#xff1a;https://www.aw-ol.com/down…

OkHttpUrlConnection库编写代码示例

OkHttpUrlConnection库编写的爬虫程序&#xff0c;该程序使用Kotlin编写的。 kotlin import java.net.HttpURLConnection import java.net.URL import java.net.URLConnection import java.io.BufferedReader import java.io.InputStreamReader fun main() { val url UR…

java学习part09类的构造器

1. 2.默认构造器 如果没有显式定义任何构造器&#xff0c;系统会默认加一个默认构造器。 如果定义了&#xff0c;则不会有默认构造器。 默认构造器的权限和类的权限一样&#xff0c;类是public构造器就是public&#xff0c;类是缺省默认构造器就是缺省 反编译之后添加的构造…

申请二级域名

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

振弦式土压力计在岩土工程安全监测应用的方案

振弦式土压力计在岩土工程安全监测应用的方案 振弦式土压力计是一种常见的土压力测量仪器&#xff0c;其原理是利用振弦在土中传播的速度与土的应力状态有关的特点测量土压力。在岩土工程安全监测中&#xff0c;振弦式土压力计可以应用于以下方面&#xff1a; 1. 地下连续墙和…

Redis入门指南学习笔记(3):Redis高级特性

一.前言 上一篇博客对Redis常用的数据结构进行了详细介绍。Redis除了丰富的数据类型支持&#xff0c;还包含许多高级特性&#xff0c;例如事务、内存驻留策略、排序、消息队列等&#xff0c;本文将对这些进行逐一介绍。 二.事务 Redis同样包含事务&#xff08;transaction&a…

mysql多表重复数据只保留一行的思路

一、问题描述 假设有3个表&#xff0c;test_a&#xff0c;test_b&#xff0c;test_c&#xff1b; test_a和test_b中有些重复数据&#xff1b; 现在要把这2个表的数据同步到表c&#xff0c;但是重复数据只保留1行。 样例如下&#xff1a; 具体要求如下&#xff1a; 1.tes…

Unity使用DOTween实现分段进度条

文章目录 需求下载安装 DOTween实现实现效果 需求 用组件进度条&#xff08;Slider&#xff09;&#xff0c;利用分段加载进行以假乱真的进度效果&#xff0c;比如说2秒钟到达20%的进度&#xff0c;10秒钟加载20%到50%进度&#xff0c;1分钟加载50%到90%的进度&#xff0c;30秒…

沉头孔和埋头孔的区别

埋头空和沉头孔的区别在于螺栓孔上部扩孔&#xff1a;沉头孔是直筒结构&#xff1b;埋头孔是四十五度结构&#xff0c;比沉头孔较为平顺。 螺栓孔上部扩孔能容纳螺栓头部&#xff0c;使螺头部不高于周围表面。埋头空和沉头孔只是两种不同的叫法。 沉头孔是 PCB 上的圆柱形凹槽…

网站定制开发有哪些分类?|企业软件app小程序定制

网站定制开发有哪些分类&#xff1f;|企业软件app小程序定制 网站定制开发是指根据客户需求&#xff0c;为其量身定制设计和开发的网站服务。目前&#xff0c;网站定制开发主要分为以下几个分类&#xff1a; 1. 静态网站定制开发&#xff1a;静态网站是由HTML、CSS和JavaScrip…

多模态常见任务介绍

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

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

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

浪涌Surge整改:保护和优化电力系统!|深圳比创达电子EMC

一、浪涌现象简介 浪涌是一种在电气系统中常见的现象&#xff0c;其涉及电压、电流的突然增加&#xff0c;超过系统的正常操作范围。这可能是由许多因素引起的&#xff0c;如雷击、设备故障、或电网中的突然负荷变化。浪涌可能导致设备损坏&#xff0c;甚至可能危及人员安全。…