Android四大组件-BroadcastReceiver、ContentProvider、Service

2023-11-17

目录

一、BroadcastReceiver

1、定义

2、作用

3、生命周期

4、广播注册方式

动态注册

静态注册

5、广播类型

普通广播:即发出广播后所有接收者都能收

有序广播:按照广播的优先级接受,broadcastReceiver可以在onReceive中使用abortBroastcast()终止广播下传

系统广播:系统的广播,如电量、锁屏等

本地广播:只在本应用内接收得到,需将exported置为false

粘留广播:Api21后已经废弃了,其作用是可以在发出广播之后注册的接收器仍然可以接收到广播

6、返回值

二、ContentProvider

1、定义

2、URI

3、详细使用待续

三、Service

1、定义

2、生命周期

3、PS

4、Service类型

5、IntentService


有兴趣可以看前面的Activity介绍:https://blog.csdn.net/wzhworld/article/details/83443862

一、BroadcastReceiver

详见:https://blog.csdn.net/carson_ho/article/details/52973504

1、定义

  • BroadcastReceiver,本质上是一个全局的监听器,属于Android四大组件之一。主要扮演角色是发送者以及接收者

2、作用

  • 广播主要可以用于不同组件、App之间的通信

3、生命周期

  • onReceive进行接收广播之后的广播处理
public class mBroadcastReceiver extends BroadcastReceiver {

  //接收到广播后自动调用该方法
  @Override
  public void onReceive(Context context, Intent intent) {
   //写入接收广播后的操作
    }
}

4、广播注册方式

  • 动态注册

@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

    //实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //设置接收广播的类型
     intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //调用Context的registerReceiver()方法进行动态注册
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


//注册广播后,要在相应位置记得销毁广播
//即在onDestroy()中unregisterReceiver(mBroadcastReceiver)
 @Override
 protected void onDestroy() {
     super.onDestroy();
      //销毁在onCreate()方法中的广播
     unregisterReceiver(mBroadcastReceiver);
     }
}

 

  • 静态注册

    • 首先在manifest中注册
      <receiver 
          //此广播接收者类是MyBroadcastReceiver
          android:name=".MyBroadcastReceiver" >
          //用于接收网络状态改变时发出的广播
          <intent-filter>
              <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
          </intent-filter>
      </receiver>
      

      后在自定义的BroadcastReceiver的onReceive进行处理即可,注意静态注册的广播需要进行一定的处理,因为在Android中为了防止恶意攻击之类,不可以随便定义静态注册,所以简单的上述代码的注册可能会接收不到广播,可以加上包名的设定,详见https://blog.csdn.net/u011386173/article/details/82889275

      intent.setPackage(getPackageName());

       

5、广播类型

  • 普通广播:即发出广播后所有接收者都能收

<receiver 
    //此广播接收者类是MyBroadcastReceiver
    android:name=".MyBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="ANY_ACTION" />
    </intent-filter>
</receiver>
Intent intent =  new Intent();
intent.setAction("ANY_ACTION");
sendBroadcase(intent);

 

  • 有序广播:按照广播的优先级接受,broadcastReceiver可以在onReceive中使用abortBroastcast()终止广播下传

sendOrderedBroadcast(intent);
abortBroastcast();
  • 系统广播:系统的广播,如电量、锁屏等

    •  
  • 本地广播:只在本应用内接收得到,需将exported置为false

  • //注册应用内广播接收器
    //步骤1:实例化BroadcastReceiver子类 & IntentFilter mBroadcastReceiver 
    myBroadcastReceiver = new MyBroadcastReceiver(); 
    IntentFilter intentFilter = new IntentFilter(); 
    
    //步骤2:实例化LocalBroadcastManager的实例
    localBroadcastManager = LocalBroadcastManager.getInstance(this);
    
    //步骤3:设置接收广播的类型 
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
    
    //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 
    localBroadcastManager.registerReceiver(myBroadcastReceiver , intentFilter);
    
    //取消注册应用内广播接收器
    localBroadcastManager.unregisterReceiver(myBroadcastReceiver );
    
    //发送应用内广播
    Intent intent = new Intent();
    intent.setAction(BROADCAST_ACTION);
    localBroadcastManager.sendBroadcast(intent);
    

    粘留广播:Api21后已经废弃了,其作用是可以在发出广播之后注册的接收器仍然可以接收到广播

6、返回值

  • 不同注册方式的onReceive中Context返回值是不一样的

    • 对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;

    • 对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;

    • 对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。

    • 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;

二、ContentProvider

1、定义

内容提供者,实现应用内、应用间建数据共享https://blog.csdn.net/carson_ho/article/details/76101093

2、URI

3、使用

  • 自定义的ContentProvider类:ContentProvider的数据一般是以"数据库"或"网络数据"的方式存储的。如果是数据库,则需要实现SQLiteOpenHelper类。通过SQLiteOpenHelper类新建/管理数据库。
  • 我们需要以继承ContentProvider的方式自定义ContentProvider时,需要实现query(), insert(), update(), delete(), getType(), onCreate()这六个函数。
  1. 创建表格
    // 创建表格的SQL语句
    private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE " + Entry.TABLE_NAME + " (" +
        Entry._ID + " INTEGER PRIMARY KEY," +
        Entry.NAME + " TEXT NOT NULL, " +
        Entry.BIRTH_DAY + " TEXT, " +
        Entry.EMAIL + " TEXT, " +
        Entry.GENDER + " INTEGER " +
        " )";
    
    ...
    
    private class DBLiteHelper extends SQLiteOpenHelper {
        public static final int DATABASE_VERSION = 1;
        public static final String DATABASE_NAME = "MyProvider.db";
    
        public DBLiteHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(SQL_CREATE_ENTRIES);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }

    在创建时execSQL语句创建数据库

  2. 注册Uri
    // Uri的authority
    public static final String AUTHORITY = "com.skw.myprovider";
    // Uri的path
    public static final String PATH = "table01";
    // UriMatcher中URI对应的序号
    public static final int ITEM_ALL = 1;
    public static final int ITEM_ID  = 2;
    
    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        URI_MATCHER.addURI(AUTHORITY, PATH, ITEM_ALL);
        URI_MATCHER.addURI(AUTHORITY, PATH+"/#", ITEM_ID);
    }

    注册Uri的目的是为了添加侦听,将Uri注册到UriMatcher中,AUTHORITY需要与manifest中的android:authorities相同一致

  3. delete()、insert()、update()、query()这几个方法都是相同类似的操作,如果底层使用的是Sqlite,那么增删查改其实就是对于这四个的封装,到这里不禁就要思考问啥不直接使用sqlite要加一层ContentProvider这么麻烦了。设想一下,假如当需要数据从网络取而不是从数据库取得,那么底层的取数据操作我们又要重新实现一遍,这很不合理,通过CP的提供接口而不关心底层实现,当需要变动了无需改动过多。
  4. Manifest注册
    <provider android:name=".MyProvider"
              android:authorities="上述定义的协议"
    />

     

  5. 对ContentProvider进行操作时,我们使用的是ContentResolver而不是CP,目的是为了统一封装接口对应用内、应用外使用
    ContentResolver cr = new ContentResolver();
    cr.insert(...);
    cr.query(...);
    cr.delete(...);
    cr.query(...);

    详细使用可见https://blog.csdn.net/carson_ho/article/details/76101093

  6. 跨应用使用后续待修改,与权限应用相关

三、Service

1、定义

运行在后台不直接与用户交互的,比如可开启线程作网络操作等

2、生命周期

https://blog.csdn.net/carson_ho/article/details/53160137

此处应该注意的是startService与bindService的区别,start后Service无法控制。而bindService启动后可通信,通过Binder

3、PS

  • startService()和stopService()只能开启和关闭Service,无法操作Service;

  • bindService()和unbindService()可以操作Service

  • startService开启的Service,调用者退出后Service仍然存在;

  • BindService开启的Service,调用者退出后,Service随着调用者销毁

4、Service类型

可见https://www.jianshu.com/p/e04c4239b07e

  • 本地服务:即正常使用只在主线程运作
  • 远程服务:跑在独立进程,需使用AIDL进行IPC操作
  • 前台服务:结合Notification显示在通知栏的
  • 后台服务:处于后台如更新天气此类
  • 详见上述的网址,讲得比较详细

5、IntentService

待后续补充,这个Service通常是用来做耗时的操作,其底层实现是通过Handler、Thread实现耗时,在onHandleIntent接收到Intent识别判断类型后可以操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android四大组件-BroadcastReceiver、ContentProvider、Service 的相关文章

随机推荐

  • 网络整理续

    计算机网络简答题 1 TCP 协议和 UDP 协议的区别有哪些 1 TCP 属于面向连接的协议 UDP 属于面向无连接的协议 2 TCP 可以保证数据可靠 有序的传输 可以进行流量控制 UDP 无法实现 3 TCP 协议有效载荷小于 UDP
  • Linux下20个常用Linux性能监控工具/命令

    此文章不作为商业用途 纯粹的用来学习 20个常用Linux性能监控工具 命令 对于 Linux Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具 这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因
  • vscode实用快捷键查找和替换

    vscode是一款功能十分强大的编辑器 且带有许多插件 利用插件可以让开发速度提升几倍甚至几十倍 vscode快捷键 查找 单文件查找 ctrl F 替换 单文件内替换一处 crtl shift 1 单文件内替换全部 ctrl alt en
  • mybatis-plus中wrapper的用法(详细)

    用到了wrapper ge le ne eq等的用法 及多表查询自写sql整理资料记录一下 以备后续复习 目录 可点击相应目录直接跳转 一 条件构造器关系介绍 条件构造器关系介绍 wapper介绍 二 项目实例 1 根据主键或者简单的查询条
  • 优秀程序员和一般程序员有什么区别?

    优秀程序员和一般程序员有什么区别 为什么有的人一入职就能平步青云 而有的人入职很久却一直在原地打转 程序员的职场进阶之路到底有多少门道 今天 我们邀请到了前Google Top Performer 来Offer的闫老师 给大家分享一下他的职
  • gitlab CI/CD系列之使用 GitLab Runner注册和基本环境配置

    由于很多时候我们的环境搭建都是在已经在对应的设备上搭建完成 或者是我们直接使用一个配置好的docker容器 开机自动启动 作为ci cd的运行环境 所以为了便利性这里主要使用的是shell模式 简介 理解了上面的基本概念之后 有没有觉得少了
  • netty-all 简介、中文文档、中英对照文档 下载

    netty all 文档 下载链接 含jar包 源码 pom 组件名称 中文 文档 下载链接 中英对照 文档 下载链接 netty all 4 0 50 Final jar netty all 4 0 50 Final API文档 中文版
  • 头歌实践教学平台数据结构与算法:02线性表

    针对数据结构02线性表在头歌平台练习过程中的完成代码 关卡数目较多 每题思路单独在每一关中解释 如有其他需求请留言 第一关 可以把问题转换为 遍历B中的元素 如果该元素不在A中 则把该元素插入到A中 由于集合中的元素没有先后顺序 因此 插入
  • Vue项目之登录注册

    Vue项目之登录注册 1 注册 1 1 注册页面的布局 1 2 注册业务逻辑的实现 2 登录 3 导航守卫 3 1全局导航守卫 全部路由都会经过这里 一定要调用next方法向下执行 3 2 路由独享的导航守卫 3 3 组件内的导航守卫 补充
  • ReactHook RefHook

    1 除了可以进行ref操作以外 还能进行数据存储的操作 即相当于在函数式组件中拥有了this 2 ref的改变不会引起组件的重新渲染 1 引入 import React Component useRef from react 2 使用ref
  • APP 抓包和微信小程序抓包-Charles 的精简使用教程

    APP 抓包和微信小程序抓包 Charles 的精简使用教程 2021 09 25 更新 2019 07 10 更新 目标 教程 一 安装 Charles 二 Charles 简介 1 Charles 欢迎页面 2 基础功能按钮 3 抓包内
  • 可视化爬虫框架spiderflow入门及实战

    官网 点击直达官网 文档 点击查看官网文档 说明 目前官网和文档均无法正常访问 原因未知 参考本文即可 再有问题欢迎留言讨论 以下内容部分来自官网或官网文档 文章比较长 请准备好瓜子和小板凳 TIP 文中用到的网站地址仅为了说明功能 如有侵
  • Android——微信登录、分享

    写在前面的话 应用要接入微信登录 分享 需要在微信的开发者平台上进行提交应用 并且审核通过 应用已经获取到appId 相关jar包下载地址 http download csdn net detail sapce fish 9571142 也
  • 链式栈(c)

    链式栈 在上节我们提到了顺序栈 而链式栈就是把顺序栈用链表的方式来存储 如果对链表和顺序栈的学习较为深刻的话 学习链式栈会非常容易 首先第一步和单链表操作基本相同 创建一个结构体 一块是数据域 另一块是指针域 用来指向下一个元素 typed
  • linux文件夹重命名

    微信可以设置雪花昵称了 真漂亮 在Linux下重命名文件或目录 可以使用mv命令或rename命令 这里分享下二者的使用方法 mv命令既可以重命名 又可以移动文件或文件夹 例子 将目录A重命名为B mv A B 例子 将 a目录移动到 b下
  • tkinter创建子窗口(只创建一个)

    import tkinter as tk 第一种直接写个类 class OneUi def init self master tk Tk self top tk Toplevel master self top geometry 600x4
  • 【直播回顾】5步实现精细化用户触达,助力业务增长

    9月17日 极光BDS产品经理刘基石通过线上直播进行了主题为 如何实现精细化的用户触达 的分享 从 用户触达的大数据 用户触达的 5 个因子 如何实现精细化触达以及精细化触达实例 4个方面 深度分享了极光如何实现精细化的用户触达 助力客户业
  • Linux Power supply子系统分析之一

    转自 http www wowotech net pm subsystem psy class overview html 1 概述 对于便携式设备 如手机或者pad来说 battery都是必不可少的一个组成部分 kernel中为了方便对b
  • IDEA-集成VisualVM插件,启动Java VisualVM

    起因 我忘了我之前起程序去关联Java VisualVM是咋配的了今天百度搜的时候意外发现idea可以直接起 只需要安装VisualVM插件然后启动Java VisualVM 安装VisualVM插件 路径 File gt Setting
  • Android四大组件-BroadcastReceiver、ContentProvider、Service

    目录 一 BroadcastReceiver 1 定义 2 作用 3 生命周期 4 广播注册方式 动态注册 静态注册 5 广播类型 普通广播 即发出广播后所有接收者都能收 有序广播 按照广播的优先级接受 broadcastReceiver可