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.hqwc.cn/news/214329.html

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

相关文章

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB为非结构化数据查询插上飞翔的翅膀——以企业知识库为例

前言 以前我曾疑惑&#xff0c;对于非结构化的内容&#xff0c;如一张图片或一段视频&#xff0c;如何实现搜索呢&#xff1f;图片或视频作为二进制文件&#xff0c;我们如何将其转化为可搜索的数据并存储起来&#xff0c;然后在搜索时将其还原呢&#xff1f; 后来我发现&…

关于进制的转化

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

【Mybatis】Mybatis操作数据库详解

Mybatis操作数据库 什么是MybatisMybatis入门准备工作创建Springboot工程 建表 创建实体类 配置数据库连接字符串编写持久层代码单元测试 Mybatis的基础操作打印日志参数传递增(insert)返回主键 删(delete)改(update)查(select) Mybatis XML配置文件配置连接字符串和Mybatis写持…

虚拟化原理

目录 什么是虚拟化广义虚拟化狭义虚拟化 虚拟化指令集敏感指令集虚拟化指令集的工作模式监视器对敏感指令的处理过程&#xff1a; 虚拟化类型全虚拟化类虚拟化硬件辅助虚拟化 虚拟化架构裸金属架构宿主机模式架构 什么是虚拟化 虚拟化就是通过模仿下层原有的功能模块创造接口来…

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

在全球碳市场中崭露头角的中碳CCNG

在全球气候治理的大背景下&#xff0c;中国碳中和发展集团有限公司&#xff08;简称中国碳中和&#xff09;正在成为全球碳交易市场的一个重要参与者。随着国际社会对碳排放的日益关注&#xff0c;中国碳中和凭借其在碳资产开发、咨询与管理等领域的深厚积累&#xff0c;正成为…

【Golang】解决使用interface{}解析json数字会变成科学计数法的问题

在使用解析json结构体的时候&#xff0c;使用interface{}接数字会发现变成了科学计数法格式的数字&#xff0c;不符合实际场景的使用要求。 举例代码如下&#xff1a; type JsonUnmStruct struct {Id interface{} json:"id"Name string json:"name"…

提供电商数据|带你简单认识天猫API接口相关参数文档调用说明

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

多actor实体组合并统一应用变换_vtkAssembly

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;创建了一个球体和立方体的三维可视化&#xff0c;将它们组合成一个装配体&#xff0c;应用变换&#xff0c;调整不透明度&#…

App Inventor 2 数字转文本

App Inventor 2 是弱语言类型&#xff0c;文本和数字之间不用刻意去转换&#xff0c;之间赋值就可以了。 案例&#xff1a;数字转文本 App Inventor 2 是弱语言类型&#xff0c;同理数字也能直接赋值给文本变量&#xff1a; 更多请参考&#xff1a;App Inventor 2 文本代码块…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

可以ping通IP但是无法远程连接-‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

起因 一开始远程连接IP&#xff0c;报错&#xff0c;怀疑是自己网络原因&#xff0c;但是同事依旧无法连接 怀疑是自己防火墙的原因&#xff0c;查看关闭依旧无法连接 问题 两个地址可以ping通排除防火墙缘故 怀疑端口&#xff0c;测试端口 然 解决方案 winR 输入control…