1-2Android基础知识-Service[亲测有效]

Android (85) 2023-04-14 11:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说1-2Android基础知识-Service[亲测有效],希望能够帮助你!!!。

这次把安卓剩余的三个组件Service、BroadcastReceiver、ContentProvider放在一起,也是因为,剩余三个组件的复杂程度、使用频率不及Activity。

不说话,先看图

1-2Android基础知识-Service[亲测有效]_https://bianchenghao6.com/blog_Android_第1张

1-2Android基础知识-Service[亲测有效]_https://bianchenghao6.com/blog_Android_第2张

Service 定义

Service 是可以在后台长期执行而没有用户交互的基础组件。Service 运行在主线程,不可以做耗时的操作。Thread 泛指新建的子线程,不能更新 UI。

Service 生命周期

Service 的生命周期,预期方式关联。启动方式有主动启动、绑定启动两种。看下两种启动方式的流程图

1-2Android基础知识-Service[亲测有效]_https://bianchenghao6.com/blog_Android_第3张

Service 流程中的核心的方法如下

  • onCreate
  • onStartCommand
  • onBind
  • onDestory

Service 的优先级

Service 按照使用场景,可以区分foreground、background、bind 三种类型,不同类型的优先级不同。优先级越低,在系统资源紧张时,越容易被系统回收掉。

优先级顺序:foreground > bind > background

在 androidmanifest 中,也可以配置 service 的优先级 android:priority = "xxxx",xxxx可以配置为整数,数字越大,优先级越高,最高值为 1000。

JobScheduleService

JobIntentService 是 Android 8.0 新增的 Service 子类,替代 IntentService。8.0 系统以后,禁止在后台直接创建 Service,但可以创建 JobIntentService。官方的定义如下:

Helper for processing work that has been enqueued for a job/service. 
When running on Android O or later, the work will be dispatched as a job via JobScheduler.enqueue. 
When running on older versions of the platform, it will use Context.startService.

解释:JobIntentService 用于处理被加入到队列的 job/service 任务的一个辅助工具。当运行在 Android O 或更高版本时,任务将作为 job 通过 JobScheduler.enqueue() 进行分发;当运行在较老版本的平台上时,任务仍旧会使用 Context.startService() 执行

Android 8.0 及以上版本 JobIntentService 和 JobService 做的事情是相同的,都是等着 JobScheduler 分配任务来执行。

不同点在于,JobService 使用的 handler 使用的是主线程的 Looper,因此需要在 onStartJob() 方法中手动创建 AsyncTask 去执行耗时任务,而 JobIntentService 则帮我们处理这一过程,使用它只需要写需要做的任务逻辑即可,不用担心阻塞主线程的问题。另外,向 JobScheduler 传递任务操作也更简单了,不需要在指定 JobInfo 中的参数,直接 enqueueWork() 方法就可以了。这有点像 Service 和 IntentService 的关系。

BroadcastReceiver

广播的定义很好理解,有发送方,有接收方,可以用于在不同的 App ,同一个 App 不同的组件、进程间通信。按发送方,广播可以分为以下四种类型

  • 普通广播
  • 有序广播
  • 本地广播
  • 系统广播

按照注册方式,又可以区分为两种

  • 静态注册
  • 动态注册

发送和接收流程

  1. 广播接收者(BroadcastReceiver)通过 Binder 机制,向 AMS 注册成为广播接收者。
  2. 广播的发送者,通过 Binder 机制,向 AMS 发送广播。
  3. AMS查找符合条件(IntentFilter、Permission)的 BroadcastReceiver,将广播发送到相应的Receiver 的队列中
  4. 消息循环执行拿到此广播,回调 BroadcastReceiver 的 onReceiver 方法

本地广播 & 普通广播

相比普通广播,本地广播更加安全、高效。本地广播的发送,只在 App 自身内传播,不必担心隐私泄露的问题,其他 App 也无法发送该广播,故不用担心安全漏洞。本地广播内部通过 Handler 实现,不牵涉跨进程通信,效率更高。

ContentProvider

ContentProvider 是一个内容提供者,一般用于 App 间数据交互和共享。底层依然使用的 Binder 机制通信。

1-2Android基础知识-Service[亲测有效]_https://bianchenghao6.com/blog_Android_第4张

访问 ContentProvider

访问 ContentProvider 的流程大致如下

1-2Android基础知识-Service[亲测有效]_https://bianchenghao6.com/blog_Android_第5张

看下面的示例代码

// Queries the user dictionary and returns results
cursor = getContentResolver().query(
    UserDictionary.Words.CONTENT_URI,   // The content URI of the words table
    projection,                        // The columns to return for each row
    selectionClause,                   // Selection criteria
    selectionArgs,                     // Selection criteria
    sortOrder);                        // The sort order for the returned rows
    
    

query 方法的参数,对比 SQL 语法,可以看下差异

query() argumentSELECTNotesUriFROM table_nameUri maps to the table in the provider named table_nameprojectioncol,col,colProjection is an array of columnsselectionWHERE col = valueSelection specifies the criteria for selection rowsselectionArgssortOrderORDER by col,colsortOrder specifies the order in which rows appear in the returned Cursor

可以理解为,ContentProvider 提供了一套更加方便、丰富的访问数据的方法,可以做到读写分离,更加安全可靠。

#android#

#service#

#2020#

发表回复