Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说1-2Android基础知识-Service[亲测有效],希望能够帮助你!!!。
这次把安卓剩余的三个组件Service、BroadcastReceiver、ContentProvider放在一起,也是因为,剩余三个组件的复杂程度、使用频率不及Activity。
不说话,先看图
Service 是可以在后台长期执行而没有用户交互的基础组件。Service 运行在主线程,不可以做耗时的操作。Thread 泛指新建的子线程,不能更新 UI。
Service 的生命周期,预期方式关联。启动方式有主动启动、绑定启动两种。看下两种启动方式的流程图
Service 流程中的核心的方法如下
Service 按照使用场景,可以区分foreground、background、bind 三种类型,不同类型的优先级不同。优先级越低,在系统资源紧张时,越容易被系统回收掉。
优先级顺序:foreground > bind > background
在 androidmanifest 中,也可以配置 service 的优先级 android:priority = "xxxx",xxxx可以配置为整数,数字越大,优先级越高,最高值为 1000。
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 的关系。
广播的定义很好理解,有发送方,有接收方,可以用于在不同的 App ,同一个 App 不同的组件、进程间通信。按发送方,广播可以分为以下四种类型
按照注册方式,又可以区分为两种
相比普通广播,本地广播更加安全、高效。本地广播的发送,只在 App 自身内传播,不必担心隐私泄露的问题,其他 App 也无法发送该广播,故不用担心安全漏洞。本地广播内部通过 Handler 实现,不牵涉跨进程通信,效率更高。
ContentProvider 是一个内容提供者,一般用于 App 间数据交互和共享。底层依然使用的 Binder 机制通信。
访问 ContentProvider 的流程大致如下
看下面的示例代码
// 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#