四大组件之Service(四)-Service的线程、工作线程、权限及系统Service

第5节 Service的线程和工作线程

刚开始使用Service的时候,常常会有一个误区:认为这个Service运行于应用中一个单独的线程。其实Service组件和其他组件一样,都是运行于这个应用的主线程当中的,它们都运行于同一个单一的线程。

可以把Service简单的理解成一个没有界面显示的Activity(这个比喻其实并不准确,因为Service可以直接调用WindowManager实现界面展示,不过这里暂时就这样理解吧)。

如果需要Service进行一个需要持续的、耗时的任务,还是需要给它开启一个工作线程。

既然Service进行耗时工作也要开启的单独的线程,那么为什么不让Activity代替Service的工作呢?例如从网络下载一个文件,可以让应用对应的Activity开启一个下载线程单独进行下载工作。即使用户在下载的时候想使用其他应用也没有关系,点击HOME按钮就可以了。下载文件的那个Activity会自动隐藏起来,根本不会影响到其他应用的使用。

这看上去也是可以的,不过千万不能忽略了安卓系统的回收机制。假如系统资源需要回收,操作系统有可能把隐藏起来的Activity给回收了,所以将一个需要长期运行的任务与随时可能被清除的Activity关联在一起是很危险的。所以安卓系统引入了Service组件来处理这种情况。Service组件的重要性在系统当中仅次于“正在与用户交互的Actvity”,是最不可能被系统自动回收的组件。以此来保证长期运行的任务能够始终运行着。

5.1 IntentService

很多时候,启动一个Service就是要它完成一个复杂而耗时的任务,完成之后,这个Service就可以退出了。

例如文件下载。Activity界面启动负责下载的ServiceService安静的下载,下载完成了,就可以自己退出。下载的过程中,Activity可以继续显示下载的进度,也可以不用关心当前的状态而完全退出。

Android SDK为开发者准备好了这样一个现成的ServiceIntentService

IntentServiceService的子类,就是为了上面的那种使用场景而设计的。Android SDK对Service类进行了进一步的封装和扩展,方便开发者直接使用,而不需要重新造轮子了。

使用IntentService

  1. 继承IntentService,实现它的onHandlerIntent()函数。onHandlerIntent()是在工作线程中被调用的,所以可以在它当中添加耗时的任务处理,

    public class MyIntentService extends IntentService {
    
        public MyIntentService() {
            super("MyIntentService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            //添加耗时的任务处理
            //如果intent携带参数,可以从intent中获取参数
            ......
        }
    
    }
  2. AndroidManifest.xml文件中,声明这个Service

使用它的时候,直接启动Service就可以了。

Intent intent=new Intent(this,MyIntentService.class);
//如果需要传递参数,可以将参数放到intent当中
startService(intent);

使用IntentService有几个需要注意的地方,

  1. 任务通过Intent发布,如果需要使用参数,参数可以通过Intent传递;
  2. 一旦任务执行完成,Service就退出了;
  3. 可以处理多个Intent请求,但是会按照请求的先来后到挨个处理,一个接一个完成后,如果没有任务了,Service就退出;

第6节 Service的使用权限

和所有别的应用组件一样,Service需要在AndroidManifest.xml文件中声明。

在应用的AndroidManifest.xml文件中,要给Service设置上android:exported属性,

<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="true"></service>
  1. android:exported属性设置成true:可被其他应用使用;
  2. android:exported属性设置成false:只能被自己所在的应用使用;

在对其他应用开放Service的时候,也可以设置上访问权限,只对部分应用开放使用的权限。

6.1 Service设置权限

  1. AndroidManifest.xml文件中,对要设置权限的Service设置上android:permission属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如"com.anddle.serviceaccess

    <service
        android:name=".MyService"
        android:enabled="true"
        android:exported="true"
        android:permission="com.anddle.serviceaccess" />
  2. 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 pomission"
            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的权限值。

第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还有很多很多,

时间: 2024-08-06 10:56:14

四大组件之Service(四)-Service的线程、工作线程、权限及系统Service的相关文章

四大组件之ContentProvider(四)-ContentProvider的权限使用和监听

第5节 ContentProvider的使用权限 ContentProvider可以被其他应用使用(就像一个公共网站,可以被任何人访问):也可以被设置成只被自己所在的应用使用(就像一个内部网站,只能在公司内部访问). 这只需要在应用的AndroidManifest.xml文件中,给ContentProvider设置上android:exported属性, <provider android:name=".MyContentProvider" android:authorities

Android 四大组件之再论service

service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是介绍一些被遗漏的地方 1.远程Service(AIDL方式) package com.joyfulmath.samples.basecontrol; import android.app.Activity; import android.content.ComponentName; import a

Android 四大组件 (二) Service 使用

一. Service 介绍 Service属于android四大组件之一,在很多地方经常被用到.开启Service有两种不同的方式:startService和bindService.不同的开启方式,Service执行的生命周期方法也不同. 分 显示/隐示调用 ,但是官网推荐用显式的方式启动Service.下面 service使用 用的就是显示调用:注意事项用的就是隐示调用,在5.0系统上隐示调用会报错.所以这里只介绍使用显示调用. 不能再service里做耗时操作,否则ANR:需要开辟子线程进行

Android深入四大组件(三)Service的绑定过程

相关文章 Android深入理解四大组件系列 前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大组件(二)Service的启动过程这篇文章,知识点重叠的部分,本篇文章将不再赘述. 1.ContextImpl到ActivityManageService的调用过程 我们可以用bindService方法来绑定Service,它的实现在ContextWra

一个帖子学会Android开发四大组件

这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Receiver详解 四.Content Provider详解 外加一个重要组件 intent的详解. 文章有部分内容来自网络,本文是一个总结性文章. 一.Activity详解 Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()-->onStart()-->onResume() 当另一个Activity

Android开发四大组件概述

这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity具体解释 二.Service具体解释 三.Broadcast Receiver具体解释 四.Content Provider具体解释 外加一个重要组件 intent的具体解释.(主要来自于网络) 1.Activity 一个Activity通常展现为一个可视化的用户界面.比如,一个activity可能展现为一个用户能够选择的菜单项列表或者展现一些图片以及图 片的标题.一个消息服务应用程序可能包括一个显示联系人列表的ac

个帖子学会Android开发四大组件

黑色幽默Lion 方向比努力重要,能力比知识重要,情商比智商重要! 首页 新闻 新随笔 管理 随笔- 43  文章- 0  评论- 12 一个帖子学会Android开发四大组件 注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重要组件 intent的详解. 一.Activity详解Activty的

一天就学会Android开发四大组件

这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解 二.Service详解 三.Broadcast Receiver详解 四.Content Provider详解 外加一个重要组件 intent的详解. 一.Activity详解 Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()-->onStart()-->onResume() 当另一个Activity启动时: 第一个Activity onPause

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇