服务Service

编程入门 行业动态 更新时间:2024-10-09 04:16:04

服务<a href=https://www.elefans.com/category/jswz/34/1770398.html style=Service"/>

服务Service

一、服务概述

Service(服务)是Android四大组件之一,是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互,一般由Activity启动,但是并不依赖于Activity。当Activity的生命周期结束时,Service仍然会继续运行直到自己的生命周期结束为止。
Service通常被称为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面。除此之外,Service还具有较长时间运行特性,它的应用场景主要有两个,分别是后台运行和跨进程访问。

1.后台运行:Senvice可以在后台长时间进行操作而不用提供界面信息,只有当系统必须要回收内存资源时,才会被毁,否则Service会一直在后台运行。

2.跨进程运行:当Senvice被其它应用组件启动时,即使用户切换到其它应用程序,服务仍将在后台继续运行。

Service总是在后台运行,其运行并不是在子线程而是在主线程中,只是它没有界面而已,它要处理的耗时操作需要开启子线程进行处理,否则程序会出现ANR(程序没有响应)异常。

Service 执行内容建议写于onCreate()方法中,该方法需自行重写。

二、服务的创建

选中程序包名,单击鼠标右键并选择[New] -> [Service] -> [Service]选项,在弹出的窗口中输入服务名称。创建好的服务如下例:

public class MyService extends Service {public MyService() {//构造方法}public IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.//throw new UnsupportedOperationException("Not yet implemented");//用于绑定,返回的IBinder用于 程序与服务间的通信}public void onCreate() {//Service执行内容建议写于本方法,本方法需要自行重写}
}

上述代码中,创建的Nyfenice继承自Senvice,默认创建了一个构造函数Myservice(),重写了onBind()方法。onBind()方法是Service子类必须实现的方法,该方法返回一个IBinder对象,应用程序可通过该对象与Service组件通信。
服务创建完成后,AndroidStudio会自动在AndroidManifest.xml文件中注册服务

例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=""xmlns:tools=""><application... ... >... ...<serviceandroid:name=".MyService"android:enabled="true"android:exported="true"></application>
</manifest>

enable属性表示是否可实例化;exported属性表示是否可被其他程序中的组件调用或交互

三、服务的生命周期

与Activity类似,服务也有生命周期,服务的生命周期与启动服务的方式有关。服务的启动方式有两种,一种是通过 startService()方法 启动服务,另一种是通过 bindService()方法 启动服务。使用不同的方式启动服务,其生命周期会不同。


onCreate()  第一次创建服务时调用,Service 执行内容建议写于onCreate()方法中,该方法需自行重写。
onStartCommand()  调用startService()方法启动服务时执行的方法。
onBind()  调用bindSeruice()方法启动服务(绑定服务)时执行的方法。
onUnbind()  调用unBindService()方法断开服务绑定时执行的方法。
onDestory()  服务被销毁时执行的方法。

如果想停止通过 startService() 方法启动的服务,只需要通过服务自身调用 stopSelf() 或其它组件stopService();如果想停止通过bindService() 方法启动的服务,需要调用 unbindService() 方法将服务进行解绑。

四、服务的启动

1. startService()方法 (-> stopService() ) 

//启动
Intent intent=new Intent(MainActivity.this,MyService.class);
startService(intent);//关闭
Intent intent=new Intent(MainActivity.this,MyService.class);
stopService(intent);

2. bindService()方法 (-> unbindService() )

public class MyService extends Service {public MyService() {//构造方法}public IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.//throw new UnsupportedOperationException("Not yet implemented");//用于绑定,返回的IBinder用于 程序与服务间的通信return new MyBinder();}class MyBinder extends Binder {// 该类存放用于控制服务的方法// 会传递给ServiceConnectionpublic void callMethodInService(){}public void methodInService(){... ...}}public void onCreate() {//Service执行内容建议写于本方法,本方法需要自行重写}
}
public class MainActivity extends AppCompatActivity {private Button bindbt,callbt,unbindbt;private MyService.MyBinder myBinder;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);bindbt.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {MyConnection myConnection=new MyConnection();Intent intent=new Intent(MainActivity.this,MyService.class);bindService(intent,myConnection,Service.BIND_AUTO_CREATE);//bindService()第三个参数为绑定标准//Service.BIND_AUTO_CREATE 表示自动创建服务(服务不存在时),服务存在时不自动创建。}});callbt.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {//调用服务内置方法myBinder.callMethodInService();}});unbindbt.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {//解绑unbindService(myConnection);}});}//服务通道类private class MyConnection extends ServiceConnection {public void onServiceConnected(ComponentName componentName, IBinder iBinder) {//成功绑定服务时调用,iBinder为绑定时传入的MyBindermyBinder=(MyService.MyBinder) iBinder;}public void onServiceDisconnected(ComponentName componentName) {//服务失去连接时调用}}
}

四、服务的通信

服务的通信
通过调用 bindService() 方法开启服务后,服务与绑定服务的组件是可以通信的,通过组件可以控制服务并进行一些操作。
在Android中,服务的通信方式有两种,一种是本地服务通信,另一种是远程服务通信。本地服务通信是指应用程序内部的通信,远程服务通信是指两个应用程序之间的通信。使用这两种方式进行通信时必须保证服务以绑定方式开启,否则无法进行通信和数据交换。

1.本地服务通信

在使用服务进行本地通信时,首先需要创建一个Service类,该类会提供一个onBind()方法,onBind()方法的返回值是一个IBinder对象,IBinder对象会作为参数被传递给ServiceCorection类中的onServiceConnected(ComponentName name,IBinder senice)方法,这样访问者(绑定服务的组件)就可以通过IBinder对象与Service进行通信


由图可知,服务在进行通信时使用的是IBinder对象,在SenviceConnection类中得到IBinder对象,通过该对象可以获取到服务中自定义的方法,执行具体的操作。以绑定方式开启服务的案例实际上就用到了本地服务通信。

2、远程服务通信

在Android中,各个应用程序都运行在自己的进程中,如果想要完成不同进程之间的通信,就需要使用远程服务通信。远程服务通信是通过AIDL(Android.Interface DefinitionLanguage)实现的,它是一种按口定义语言(Interface Definition Language),其语法格式非常简单,与Java中定义按口类似,但是存在一些差异,具体介绍如下:
·AIDL定义接口的源代码必须以 .aidl 结尾。
·AIDL按口中用到的数据类型,除了基本数据类型String List Map Charsequence之外,其它类型全部都需要导入包,即使它们在同一个包中。

更多推荐

服务Service

本文发布于:2023-11-17 10:44:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1641639.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Service

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!