一、Service

1.1、Service简介

Service是一种长生命周期的组件,是一个没有界面的Activity,它是Activity的叔叔。

·Service长期在后台运行,用来访问网络、播放音乐、操作文件或与内容提供者交互等无关界面的操作。

·Service和Thread类似,但是Thread不安全也不严谨。

·Service是运行在主线程中,因此不能用来做耗时的操作。

1.2、Android进程

进程优先级由高到低的顺序:

·前台进程(Foreground progress)

·可视进程(Visible process),可以看见,但是不可以交互。

·服务进程(Service process)

·后台进程(Background process)

·空进程(Empty process)当程序退出时,进程没有被销毁,而是变成了空进程

1.3、进程回收

Android系统有一套内存回收机制,会根据优先级进行回收。Android系统会尽可能的维持程序的进程, 但是终究还是需要回收一些旧的进程节省内存提供给新的或者重要的进程使用。
· 进程的回收顺序是:从低到高
· 当系统内存不够用时, 会把空进程一个一个回收掉
· 当系统回收所有的完空进程不够用时, 继续向上回收后台进程, 依次类推
· 但是当回收服务, 可视, 前台这三种进程时, 系统非必要情况下不会轻易回收, 如果需要回收掉这三种进程, 那么在系统内存够用时, 会再给重新启动进程;但是服务进程如果

用户手动的关闭服务, 这时服务不会再重启了

1.4、生命周期

标准方式开启服务,服务会执行onCreate方法,如果服务已经被创建,就不会再去执行onCreate方法。多次的开启服务会执行onStartCommand()方法,它替代了过时的onStart()方法。

停止服务,服务会执行ondestry()方法。

1.标准模式

Intent intent = new Intent(MainActivity.this,PhoneServer.class);
startService(intent);

Activity通过标准模式开启的服务长期在后台运行,不可以调用服务里的方法。

oncreate() -->onstartCommand()--->onstartCommand()--->onDestory();

2.绑定模式

Intent intent = new Intent(MainActivity.this, PhoneService.class);
/*** service:intent* conn 服务的通讯频道* 服务如果在绑定的时候不存在,会自动创建* */
bindService(intent, new MyConn(), BIND_AUTO_CREATE);

Activity通过绑定模式开启的服务可以调用服务的方法,但是不能长期运行在后台。

onCreate()-->onbind()-->onUnbind()-->ondestroy();

·如果obind方法返回值是null,onServerConnected方法不会被调用。

·绑定的服务在系统设置界面,正在运行条目是看不到的。

·绑定的服务和Activity不求同时生,但求同时死。

·解除绑定服务后,服务会立即停止,且服务只可以被解除绑定一次,多次解除绑定代码会抛出异常。

3.混合模式

Activity通过混合模式开启服务即可以长期在后台运行,也可以调用服务中的方法。

·首先通过标准模式启动服务,这样服务就长期在后台运行。

·如果需要调用服务中的方法,则再使用绑定模式绑定服务。

·如果需要解绑服务则调用unbindService()解绑服务。

·如果需要停止服务,则调用stopService()停止服务。

注:有时候我们解绑服务后,发现还是可以调用服务中的方法,是因为垃圾回收器还没有回收调用该方法的对象。

1.5、Service通信

由上面可以知道,Activity只有绑定模式开启服务才能调用服务中的方法,别忘记解绑服务:

我们需要在服务中创建一个类,继承iBinder的子类Binder,来充当我们的代理类

除此之外,还可以使用接口解耦,创建一个接口充当代理类的父类,让定义的代理类实现该接口中的方法再调用服务中的方法,然后在onBind中返回代理类,

在MainActivity中的再进行强制类型转换,和以上实现方法一样。

1.6、远程服务

aidl()Android Interface definition language),它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口

IPC(interprocess communication)内部进程通信,满足两个进程之间接口数据的交换。

1.使用方法

a) .java的接口文件后缀修改成.aidl文件,并删除piblic访问修饰符。

b) 在工程目录gen目录下会自动编译成Iservice.java的接口文件。

c) 远程服务代码

private class MyBinder extends IService.Stub

d) 本地服务代码

IService = IService.Stub.asInterface(setvice)

e)IService.callMethodInService()

这里不多讲述,在后面的IPC机制讲解时进行详细说明。

1.7、IntentService

1、简介

IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样

,同时,当任务执行完后,

IntentService会自动停止,另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,

并且,每次只会执行一个工作线程,

执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。

2、使用

服务是运行在主线程的,我们不能在服务中做耗时操作,而IntentService却刚好是用来解决该问题的,当然在服务中做耗时操作有两种,

第一种直接开启线程,第二种则是用IntentService。

@Override
protected void onHandleIntent(Intent intent) {// Intent是从Actvity发过来的,携带识别参数,根据参数不同执行不同人物String action = intent.getExtras().getString("param");if(action.equals("oper1")){System.out.println("Operation1");}else if (action.equals("oper2")) {System.out.println("Operation2");}SystemClock.sleep(2000);
}

onHandleIntent方法就是专门用来处理耗时操作的。

1.8、Android中的反射

1.反射挂断电话


a)找到上下文的mBase引用的类,ContextImpl,通过查看getSystemService源码可以知道,所有的系统服务都在一个map集合中。

b)接下来去查找map集合SYSTEM_SERVERCE_MAP,发现它其实是一个hashMap,这里需要详细解说:

为什么谷歌需要包装上下文?假设在没有上下文的情况下,想要调一个服务,首先要绑定该服务,如果成功绑定会返回IBinder,拿到IBinder后还需要将它转化成为接口类型,

才能去调用它的函数,所以谷歌在设计的时候将常用的上下文都包装好了,这样对程序员开发更加的方便,快捷。

由于某些服务被认为不安全或侵犯用户隐私,所以谷歌在包装系统服务的时候,将某些服务进行了隐藏(@hide),比如挂断电话。

我们需要先拿到ServiceManager对象, 但是谷歌不希望我们使用该对象,所以将该对象进行隐藏,所以参考下面的反射。

c) 通过当前的service类的字节码来获取ServiceManager的字节码文件

d) 下一步则是将iBinder转成接口类型,需要两个aidl文件,其中一个是依赖另外一个存在的,注意保证包名一致

e) 这时系统会在gen目录的com.android.internal.telephony包下自动生成一个ITelephony.java的接口文件

f) 继续代码实现反射挂断电话的操作,这时会出现很多高级的api可以供我们使用了

// IBinder iBinder = ServiceManager.getService(TELEPHONY_SERVICE)
try {Class clazz = CallSmsSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");Method method = clazz.getDeclaredMethod("getService", String.class);IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);iTelephony.endCall();
} catch (Exception e) {e.printStackTrace();
}

g)要挂断电话还需要添加拨打电话的权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

2.反射清除缓存

a)获得两个aidl文件,一个是依赖另外一个存在的

b)这个时候,系统会自动生成一个接口文件,然后我们就可以使用它了

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);PackageManager manager = getPackageManager();Method[] methods = PackageManager.class.getDeclaredMethods();for (Method method : methods) {if ("getPackageSizeInfo".equals(method.getName())) {try {method.invoke(manager, getPackageName(),new MyPackageStatsObserver());} catch (Exception e) {e.printStackTrace();}}}}private class MyPackageStatsObserver extends IPackageStatsObserver.Stub {@Overridepublic void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException{long cacheSize = pStats.cacheSize; // 缓存大小long codeSize = pStats.codeSize;// 代码大小long dataSize = pStats.dataSize;// 数据大小
        }}
}

d)记得添加权限

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>

转载于:https://www.cnblogs.com/pengjingya/p/5508709.html

14、四大组件--Service相关推荐

  1. Android四大组件Service之AIDL详解

    Android四大组件Service之AIDL详解 前言 简介 基础知识 AIDL 服务端 定义AIDL文件规则 创建 .aidl 文件 清单注册 通过 IPC 传递对象 调用 IPC 方法 Andr ...

  2. Android之四大组件(Service的开启与关闭)

    个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 服务(Service)是Android系统中的四大组件之一.服务主要用于两个目的:后台运行和跨进程访问.通过启 ...

  3. Android四大组件-Service

    目录 启动方式 独立启动 使用场景 生命周期 绑定启动 使用场景 生命周期 特性 多次启动 版本适配 5.0(21) 8.0(26) 9.0(28) 12(31) 后台启动服务思路 广播启动 省电白名 ...

  4. android组件启动,Android四大组件Service之StartService启动

    对于Service两种方式在概述里已经介绍了,下面是学习是StartService的代码实例. service启动代码: package com.example.service01; import a ...

  5. Android四大组件——Service

    前言 Service可以理解为没有布局的Activity,可以进行音乐播放,后台下载等操作. 注意:Service是运行于主线程中的,不能进行耗时操作. 如何创建一个Service Service从创 ...

  6. android studio四大组件,Android 四大组件 Service 完全理解

    瞎忙到头晕... Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如 ...

  7. Android 四大组件 Service

    1. 适用范围 Service主要使用在后台比较耗时和运行时间较长的逻辑.但是在service中使用 Thread.currentThread().getId() 获取得到的却是1,也就是主线程.如果 ...

  8. Android之四大组件(AIDL Service的使用)

    跨进程调用Service(AIDL Service) Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 在前一篇文章(关于Android中的四大组件(Se ...

  9. 6 四大组件之Service

    6-1 Servie概述 组件篇--Service 定义: 1.后台运行,不可见,没有界面 2.优先级高于Activity Service是Android系统的后台服务组件,适用于开发无界面.长时间运 ...

最新文章

  1. 传统网站与Web标准——表格布局实例
  2. 全国计算机等级考试题库二级C操作题100套(第91套)
  3. gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文
  4. 关于各种地图(百度、高德等等)的坐标类型以及相互转换
  5. c# 实现模糊PID控制算法
  6. FileZilla Server连接服务器失败
  7. 现代雷达系统分析与设计---动目标检测(MTD)
  8. 基于Java怎么实现扫码登录
  9. 数据分析五、Apriori 算法之关联分析
  10. 标志寄存器(PSW)
  11. 导出公众号历史文章,批量下载微信公众号数据分析
  12. 通证大局观(二):通证权益解析
  13. Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 .
  14. 08 - 文章详情页面
  15. 工作太闲闹心怎么办啊
  16. 浅谈电气火灾监控系统在轨道交通的产品选型与应用
  17. dreamspark 注册,wp7 app hub微软手机开发者帐号(全新3步注册)
  18. 【正点原子STM32连载】 第三十八章 红外遥控实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  19. cad面积计算机,AutoCAD如何测面积 AutoCAD面积计算方法
  20. ArcGIS 对等高线进行标注

热门文章

  1. c语言编写弹窗提示是否确认退出_世人觉得C语言和C++太难?没前途?过来人告诉你真相...
  2. CSS Border属性solid(实线)使用介绍
  3. rust大油井频率怎么用_数据量大怎么搞?当然是用这个了!
  4. c语言试题 改错题,精选二级C++试题 – 改错题
  5. PHP如何调取vlc播放rtsp,H5+VLC播放RTSP视频流
  6. 第十六届智能车竞赛广东省线上比赛第二波来袭
  7. 2021年春季学期-信号与系统-第二次作业参考答案-第一小题
  8. 2020人工神经网络第一次作业-参考答案第十部分-第三小题
  9. jmeter tps指标在哪里看_JMeter功能不够用?看这里
  10. oracle 只读同名词,Oracle创建只读用户,授予视图/同义词/会话权限