四大组件之Service(四)-Service的线程、工作线程、权限及系统Service
更新时间 | 修改意见 |
---|---|
2016-08-02 | 陈敏 |
第5节 Service的线程和工作线程
刚开始使用Service
的时候,常常会有一个误区:认为这个Service
运行于应用中一个单独的线程。其实Service
组件和其他组件一样,都是运行于这个应用的主线程当中的,它们都运行于同一个单一的线程。
可以把Service
简单的理解成一个没有界面显示的Activity
(这个比喻其实并不准确,因为Service
可以直接调用WindowManager
实现界面展示,不过这里暂时就这样理解吧)。
5.1 Service的工作线程
如果需要Service
进行一个需要持续的、耗时的任务,还是需要给它开启一个工作线程。
既然Service
进行耗时工作也要开启的单独的线程,那么为什么不让Activity
代替Service
的工作呢?例如从网络下载一个文件,可以让应用对应的Activity
开启一个下载线程单独进行下载工作。即使用户在下载的时候想使用其他应用也没有关系,点击HOME
按钮就可以了。下载文件的那个Activity
会自动隐藏起来,根本不会影响到其他应用的使用。
这看上去也是可以的,不过千万不能忽略了安卓系统的回收机制。假如系统资源需要回收,操作系统有可能把隐藏起来的Activity
给回收了,所以将一个需要长期运行的任务与随时可能被清除的Activity
关联在一起是很危险的。因此安卓系统引入了Service
组件来处理这种情况。
正在运行的Service
组件被系统回收的可能性与隐藏起来的Activity相比,会低很多。它能保证长期运行的任务能够始终运行着。
但要注意的是,这里并不是说不要在Activity当中创建工作线程。在Activity当中创建工作线程,进行短时间的耗时工作(例如,访问网络读取一条数据,然后显示到界面上)是完全没有问题的。
5.2 IntentService
很多时候,启动一个Service
就是要它完成一个复杂而耗时的任务,完成之后,这个Service
就可以退出了。
例如文件下载。Activity
界面启动负责下载的Service
,Service
安静的下载,下载完成了,就可以自己退出。下载的过程中,Activity
可以继续显示下载的进度,也可以不用关心当前的状态而完全退出。
Android SDK为开发者准备好了这样一个现成的Service
-IntentService
。
IntentService
是Service
的子类,就是为了上面的那种使用场景而设计的。Android SDK对Service
类进行了进一步的封装和扩展,方便开发者直接使用,而不需要重新造轮子了。
使用IntentService
,
继承
IntentService
,实现它的onHandlerIntent()
函数。onHandlerIntent()
是在工作线程中被调用的,所以可以在它当中添加耗时的任务处理,public class MyIntentService extends IntentService {public MyIntentService() {super("MyIntentService");}@Overrideprotected void onHandleIntent(Intent intent) {//添加耗时的任务处理//如果intent携带参数,可以从intent中获取参数......}}
在
AndroidManifest.xml
文件中,声明这个Service
;
使用它的时候,直接启动Service
就可以了。
Intent intent=new Intent(this,MyIntentService.class);
//如果需要传递参数,可以将参数放到intent当中
startService(intent);
使用IntentService
有几个需要注意的地方,
- 任务通过
Intent
发布,如果需要使用参数,参数可以通过Intent
传递; - 一旦任务执行完成,
Service
就退出了; - 可以处理多个
Intent
请求,但是会按照请求的先来后到挨个处理,一个接一个完成后,如果没有任务了,Service
就退出;
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
第6节 Service的使用权限
和所有别的应用组件一样,Service
需要在AndroidManifest.xml
文件中声明。
在应用的AndroidManifest.xml
文件中,要给Service
设置上android:exported
属性,
<service
android:name=".MyService"android:enabled="true"android:exported="true"></service>
android:exported
属性设置成true
:可被其他应用使用,这也是Service
被创建后使用的默认属性;android:exported
属性设置成false
:只能被自己所在的应用使用;
在对其他应用开放Service
的时候,也可以设置上访问权限,只对部分应用开放使用的权限。
6.1 Service设置权限
在
AndroidManifest.xml
文件中,对要设置权限的Service
设置上android:permission
属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如"com.anddle.serviceaccess
,<service android:name=".MyService"android:enabled="true"android:exported="true"android:permission="com.anddle.serviceaccess" />
在
AndroidManifest.xml
文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做com.anddle.serviceaccess
的权限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.anddle.lifetime"><permission android:name="com.anddle.serviceaccess"android:label="service permission"android:protectionLevel="normal" /><application ....../></manifest>
其中
android:name
属性的值,就是<service/>
标签中设置的android:permission
的值。
6.2 使用带权限的Service
假如应用B要使用应用A中带权限的Service
,需要在应用B的AndroidManifest.xml
中加入权限的使用,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.anddle.calculator"><uses-permission android:name="com.anddle.serviceaccess"/><application
....../></manifest>
其中,<uses-permission/>
标签中设置的android:name
的值,就是应用A中对外声明的那个service
的权限值。
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
第7节 ADB调试和系统自带的Service
7.1 ADB启动service
用ADB工具启动已知Service,
$ ./adb shell am startservice -n 包名/包名.activity名称
这里的包名就形如:com.android.xxx,例如
$ ./adb shell am start -n com.android.xxx/com.android.xxx.MyService
7.2 系统自带的Service
安卓系统当中也自带了不少的Service
,比如WindowManager
BluetoothManager
等等等等。
要使用它们也很简单,比如,
//获取WindowManager
WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowmanager.xxx();//获取BluetoothManager
BluetoothManager bluetoothmanager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothmanager.xxx();
获取到这些Service
对外提供的接口以后,就可以使用这些接口了。
类似的Service还有很多很多,
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。
*最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/
四大组件之Service(四)-Service的线程、工作线程、权限及系统Service相关推荐
- Service的线程、工作线程、权限及系统Service
Service组件和其他组件一样,都是运行于应用的主线程当中,它们都运行于同一个单一的线程中. 可以把Service简单的理解成一个没有界面显示的Activity(这个比喻其实并不准确,因为Servi ...
- 四大组件之ContentProvider(四)-ContentProvider的权限使用和监听
更新时间 修改意见 2016-08-02 陈敏 第5节 ContentProvider的使用权限 ContentProvider可以被其他应用使用(就像一个公共网站,可以被任何人访问):也可以被设置成 ...
- Android 四大组件之——Acitivity(四) Activity是如何加载显示内容的?
1. 在Activity调用onCreate()等生命周期之前,Activity会调用attach()方法,而在attach()方法中会调用如下代码 onAttach() {PolicyManager ...
- 下面不是android四大组件之一的是,Android四大组件之一 Service
Service是长期在后台运行的没界面的Android四大组件之一,默认是运行在主线程中的,如果在service中执行耗时操作超过20秒没响应的话就会造成ANR,所以可以使用IntentService ...
- 四大组件之Service(一)-双子座的Service-Start Service与Bind Service
更新时间 修改意见 2016-08-02 陈敏 第1节 Service介绍 Service是安卓系统的四大组件之一.如果说Activity是专门为用户"看"的系统组件,那Servi ...
- 一个帖子学会Android开发四大组件
注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Re ...
- Android开发四大组件
2019独角兽企业重金招聘Python工程师标准>>> 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadc ...
- Android四大组件之bindService源码实现详解
Android四大组件之bindService源码实现详解 Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindServic ...
- 一天就学会Android开发四大组件
这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Receiver详解 四.Content Provider详解 外 ...
最新文章
- 算法:模式匹配之KMP算法
- mysql视频教程siki_siki老师MySQL数据库从零到精通,资源教程下载
- [转]linux下TCP连接占用的资源
- Linux命令之文件处理
- 非关系型数据库(非RDBMS)介绍
- intellij中的required和found各指什么
- 严阵以待的意思是什么,怎么用严阵以待造句?
- Linux 终端操纵之扼要疾速指南(2)
- c语言课程设计物业,C语言课程设计报告--物业管理系统.doc
- Python 好玩代码
- Unity3d 人物跳跃后落地悬空问题
- layer.open(常用)
- linux连接蓝牙没声音,Linux Ubuntu18.04蓝牙没声音 org.bluez.Error.Failed, name org.PulseAudio1 already taken...
- 去掉无序列表前默认加上的小圆点——实战练习需到的问题解决办法mark
- 计算机智能未来发展趋势,在未来,人工智能的几个发展方向或趋势!
- (程序员/软件工程师/开发者)编程——计算机专业英语学习指引
- RS422-485接口电路设计要点
- 美学心得(第二百三十一集) 罗国正
- redis 11.哨兵模式(实现步骤,主机下线从机选举主机机制)
- Arduino 常用函数参考文档