Service是Android四大组件之一,与Activity很相似。
一、Service基础
1、Service与Activity比较
相同点:
都具有生命周期的概念;
需要继承相应的父类(Activity extends Activity;Service extends Service)
需要在AndroidManifest.xml中进行配置,且都能通过intent-filter进行过滤
都是从Context派生而来
不同点:
service没有界面,一直在后台运行
2、创建配置Service的基本套路
开发Service总体来说需要两个步骤:
a、定义一个继承Service的子类
b、在AndroidManifest.xml中配置该Service
3、Service生命周期方法介绍
IBinder onBind(Intent intent):该方法是Service子类必须实现的方法。方法返回一个IBinder对象,程序可以通过该对象与Service进行通信。
void onCreate():当该Service第一次被创建后将立即回调该方法。
void onDestroy():当该Service被关闭之前将回调该方法。
void onStartCommand(Intent intent,int flags,int startId):每次客户端调用startService(Intent)方法启动该Service时都会回调该方法。
boolean onUnbind(Intent intent): 当该Service上绑定的所有客户端都断开连接时将会回调该方法。
4、Service的启动和停止
Android中运行Service有两种方式:
a、通过Context的startService(Intent)启动,通过该方法启动Service,访问者与Service之间没有关联,即使访问者退出了,Service仍然运行。
第一次调用startService(Intent)时,会回调Service的onCreate()方法,之后再次调用startService(Intent)时,onCreate()方法不执行,但是每次都会执行onStartCommand(Intent intent,int flags,int startId);通过startService()启动的Service,必须通过stopService()来停止。不论之前调用了几次start,调用一次stop即可。
b、通过Context的bindService()启动,通过该方法启动Service,访问者与Service绑定在一起,访问者一旦退出,Service也就终止(此处应该注意,不同的activity调用多次bindService()时,需要所有的activity都退出后,Service才会终止)。
同一个activity多次调用bindService()绑定同一个Service时,onBind()方法只被回调一次。
调用unbindService()解除绑定。
绑定方式时,可以实现组件与Service的交互。
5、Service的生命周期
该图描述了启动Service的两种方式以及它们的生命周期。service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。如果在service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。所以,对service的理解就是和activity平级的,只不过是看不见的,在后台运行的一个组件,这也是为什么和activity同被说为Android的基本组件。另外一个参考图片,如下:
二、Service应用
1、基本应用
a、start方式:
1、定义Service,重写父类方法 public class MyService extends Service{ Override onCreate,onStartCommand,onDestroy } 2、activity中调用start public class MyserviceActivity extends Activity{ ... Intent intent=new Intent(this,MyService.class); startService(intent); ... } 3、AndroidManifest.xml中配置service <service android:name="com.example.service.MyService" > </service>
b、bind方式:
如果Service和访问者之间需要进行方法调用或者数据交换,应该使用bindService()和unbindService()方法启动、关闭Service。
bindService的完整方法签名:bindService(Intent service,ServiceConnection conn,int flags),参数解释如下:
service:通过Intent指定需要启动的service
conn:ServiceConnection对象,用于监听访问者与Service之间的连接情况。成功绑定时,将回调其onServiceConnected();service所在的宿主进程由于异常或其他原因终止,导致service与访问者之间的连接断开时,回调其onServiceDisconnected()。其中,主动unbind时,onServiceDisconnected()不被执行。
flags: 指定绑定时如果service还未创建,是否自动创建Service。0,不自动创建;BIND_AUTO_CREATE,自动创建。
Service类的IBinder onBinde(Intent intent)方法,在绑定本地service时,返回的IBinder对象将会传给ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法的service参数,这样访问者就可以通过IBinder对象与service进行通信。通常,在开发中,采用继承Binder的方式实现自己的IBinder对象。
1、实现自定义Binder,可以在Service实现类中采取内部类的方式实现 public class MyBinder extends Binder { public int getCount() { return count; } } 2、实现Service,定义成员变量Binder,并在onBinder中返回。 public class MyService extends Service { private MyBinder binder = new MyBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return binder; } } 3、activity中定义ServiceConnection,并在onServiceConnected()中获取onBind()返回的Binder实例,用于方法调用或数据获取。 public class MyserviceActivity extends Activity{ private MyService.MyBinder service;//用于bind时,activity与service进行通信 private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.i(tag, "service disconnnect"); } /* * IBinder对象可以实现与service的通信 */ @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.i(tag, "service connect"); MyserviceActivity.this.service=(MyService.MyBinder)service; } }; }
2、IntentService应用
IntentService是Service的子类,比普通Service增加了额外的功能。
Service本身存在如下两个问题:
Service不会专门启动单独的一个进程,与应用处于同一个进程;
Service不是专门的一个新的线程,不应该在Service中执行耗时任务,否则会出ANR。
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。而在一般的继承Service里面如果要进行耗时操作就必须另开线程,但是使用IntentService就可以直接在里面进行耗时操作,因为默认实现了一个worker thread。对于异步的startService请求,IntentService会处理完成一个之后再处理第二个。
IntentService具有如下特征:
创建单独的线程处理所有Intent请求;
创建单独的线程处理onHandleIntent()方法实现的代码;
处理完所有请求后,IntentService会自动停止;
onBind()方法提供了默认实现,默认返回null;
onStartCommand()方法提供了默认实现,将intent插入到工作队列中;
补充说明:
Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。
那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。
应用场景:
在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。
3、跨进程应用
相关推荐
本系列文章将专注于如何利用Android Service实现一个断点续传下载的功能,这是一种允许用户在应用程序中断后从上次停止的位置继续下载文件的技术。 断点续传下载的核心在于能够识别并利用已下载部分的信息,通常...
本项目"Android应用开发记录-字幕播放器(3)工程包"专注于使用`Service`来实现音频播放功能,结合了`MediaPlayer`和`Proxy`技术。下面将详细解析这些知识点。 首先,`Android Service`是Android系统中的一种组件,...
当用户触摸屏幕并移动手指时,记录触控点的位置,并计算滑动的轨迹。 4. **手势识别**:使用Android的`GestureDetector`或`MotionEvent`API来识别滑动手势。你可以定义一个滑动阈值,只有当用户的滑动距离超过这个...
在Android开发过程中,开发者需要掌握一系列的技术点,包括但不限于组件使用、UI设计、网络通信、数据存储、性能优化等。"Android代码-android-note"这个压缩包文件很可能包含了开发者在实践这些技术时积累的笔记和...
Android系统提供了服务(Service)组件,允许应用在后台运行,即使用户离开应用界面,也能继续执行定位任务。 10. **用户界面(UI)设计**: 一个良好的UI设计可以提升用户体验。开发者需考虑如何清晰地展示定位...
3. **服务(Service)**:后台播放功能通过继承Android的Service实现,Service在后台运行,即使用户离开应用,音乐播放也能继续。在Service中实现播放控制逻辑,确保在不同Activity间切换时仍能保持播放状态。 4. **...
在Android平台上,开发一款手机卫士应用涉及到许多技术点,特别是流量管理功能是现代移动设备用户非常关注的一个特性。在“Android项目实战--手机卫士34--流量管理”中,我们将深入探讨如何构建这样的功能,帮助用户...
后台可能使用了Node.js、Python或Django等后端技术,搭配数据库如MySQL、PostgreSQL或MongoDB存储用户信息和交易记录。 【标签】:无 由于没有特定的标签,我们无法明确知道该项目关注的具体技术领域或特性。但...
【描述解析】:“android-amap-track-collect-master”描述进一步证实了这是一个Android应用,该应用的核心功能是收集用户的轨迹数据,可能是为了实现导航、位置记录、运动健康或其他相关用途。由于没有更多的描述...
最后,源码中可能还涉及到了一些Android的高级特性,比如服务(Service)或者内容提供者(ContentProvider),这些都是Android应用架构的重要组成部分。如果存在,我们需要深入学习它们在监控屏幕状态中的作用和实现...
总结来说,"Android Service多线程断点下载"是一项技术性的挑战,需要理解Service的工作机制,熟练掌握多线程编程,以及有效地实现文件的断点续传功能。通过这个主题,开发者可以提升Android应用的用户体验,提供...
- **基本概念**:讲解Activity、Service、Broadcast Receiver等Android应用的基本组成部分。 - **用户界面设计**:介绍如何使用XML布局文件来构建应用的用户界面,以及如何使用Java代码控制界面元素的行为。 ####...
"Speak-To-Me" 是一个基于Android平台的项目,它主要关注的是语音识别与合成技术的应用。这个项目可能是一个小型的语音助手应用,允许用户通过语音进行交互,比如执行命令、查询信息等。在Android开发中,语音功能的...
本文将深入探讨jChat1.4版本的设计理念、技术实现以及其在Android开发中的重要知识点。 1. **项目结构与模块化设计** jChat1.4采用了清晰的项目结构,通常包括`app`、`library`、`util`等多个模块。`app`模块是主...
【Android音乐播放器设计与实现】 ...通过这个课程设计,学生不仅能够深入理解Android开发,还能够掌握音乐播放器的关键技术和实践技巧,提高解决问题的能力,为未来在移动开发领域的发展打下坚实的基础。
在本项目"android_rtspplayer-...总的来说,"android_rtspplayer-master"项目涵盖了多个Android开发和网络视频处理的关键技术,对于希望学习如何在Android上实现视频监控和设备控制的开发者来说,是一个宝贵的资源。
【Android 模拟速度表盘】是一个典型的Android应用开发项目,尤其适合计算机科学与技术专业的学生作为毕业设计来深入理解移动应用开发。这个项目的核心功能是创建一个虚拟的速度表盘,能够模拟汽车或其他交通工具的...
5. **服务框架**:实现服务注册、服务发现、服务间通信等功能,这部分代码可能涉及到了Android的Service组件和Binder机制。 6. **安全与隐私**:包含加密算法、鉴权机制以及隐私保护策略的实现,保障通信过程的安全...