什么是Service?
一、Service
1.Service简介
Service为Android四大组件之一,Service与Activity组件相似,都代表可执行的程序且有自己的生命周期,唯一的区别是Activity组件提供界面方便人机交互而Service只在后台运行且没有交互界面。需要注意的是,Service不是一个单独的进程或为了防止应用出现无反应错误单独的线程,它像其他应用对象一样运行在其托管进程的主线程中。当然,如果我们希望自己的Service能够在后台运行MP3或者网络下载,我们可以创建一个线程来实现。
2.Service的生命周期
由于Service可由两种方式启动:Context.startService()和Context.bindService().
(1)Context.startService()方法:通过该方法启动Service,访问者(客户端)与Service之间没有关联,即使访问者退出了,Service仍然运行。调用Context.startService()触发的Service生命周期方法:
onCreate()->onStartCommand(Intent, int, int) ->Service运行-> Context.stopService()或 stopSelf()->Service被关闭
(2)Context.bindService()方法:通过该方法启动Service,访问者(客户端)与Service绑定在一起,访问者一旦退出,Service也就终止了。调用Context.startService()触发的Service生命周期方法:
onCreate()->OnBind(Intent)->客户端绑定到Service->OnUnbind()->onDestory()->Service被关闭
升华笔记1:
1.当调用Context.bindService()方法启动一个Service时,不会执行onStartCommand(Intent, int, int)方法;
2.当Activity(客户端的Activiy)调用BindService()绑定一个已启动的Service(Activity起初通过startService()方法启动)时,系统只是把Service内部IBinder对象(由onBind()方法返回)传递给Acitvity,并不会把该Service生命周期完全"绑定"到该Activity,因而当Activity调用unBindService()方法取消与该Service的绑定时,也只是切断该Activity与Service之间的关联,并不能停止该Service组件。
3.API-Service
public abstract class Service
(1)继承关系
java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Service
(2)构造方法
Service()
但是,一般我们在开发Service时主要是通过Content.getService()方法来获取Service类对象。
(3)常用方法(Service组件方法)
void OnCreate():当该Service第一次被创建后将立即被调用;
public int onStartCommand(Intent intent, int flags, int startId):每次客户端调用startService(Intent)方法启动指定Service时都会被调用,客户端传入的参数:Intent:由startService(Intent)传入的"意图".
public abstract boolean stopService (Intent service):客户端调用该方法关闭Service
public final void stopSelf ():Service自动关闭
public abstract IBinder onBind (Intent intent):该方法是Service子类必须实现的方法,其返回一个IBinder对象,客户端应用程序可通过该对象与Service组件通信。参数Intent对象用于将客户端绑定到Service,传递给Context.bindService。
boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开链接时将会调用该方法
void onDestory():当该Service被关闭之前将会调用该方法,Service将会清理其占有的所有资源(包括所有线程、注册在Service上的接受者)。
二、开发Service基本思路
1.创建、配置Service
(1)定义一个继承于Service的子类,如果希望Service组件完成某些事情,我们只要在onCreate()或onStartCommand()方法中定义相关的业务代码即可。
一个Service组件的框架如下:
\src\service\FirstService.java
public class FirstService extends Service
{
/*a.必须实现的方法,返回一个IBinder对象给客户端以便实现通信*/
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
/*b.Service被创建时回调该方法*/
@Override
public void onCreate()
{
super.onCreate();
System.out.println("Service is Created");
}
/*c.Service被启动时回调该方法*/
@Override
public int onStartCommand(Intent intent,int flags,int startId)
{
Sytem.out.println("Service is Started");
return START_STICKY;
}
/*d.Service被关闭之前回调*/
@Override
public void onDestroy()
{
super.onDestroy();
System.out.println("Service is Destroyed");
}
}
2.在AndroidManifest.xml文件中配置该Service
定义了上面的Service之后,接下来需要在AndroidManifest.xml文件中配置该Service,配置Service使用<service../>元素。与配置Activity相似的是,配置Service时也可为<service../>元素配置<intent-filter../>子元素,用于说明该Service可被哪些Intent启动。
<!--配置一个Service组件-->
<service
android:name=".FirstService">
<intent-filter>
<!--为该service组件的intent-filter配置action-->
<action android:name="com.example.service.FIRST_SERVICE"/>
</intent-filter>
</service>
升华笔记2:
Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序。所以,开发Service类似于开发Activity,我们只需定义一个继承Service的子类并且在AndroidManifest.xml文件中配置该Service后,就能在程序中运行该Serviec。如何启动一个Service呢?我们可以在本应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动一个service,也可以在另一个应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动这个service.
3.启动和停止Service
当Service开发完成后,我们可以在自身应用的Activity子类中启动该Service,也可以在其他应用中启动该Service。这里,我们在本应用中启动(关闭)该Service,使用Content.startService(Intent intent)方法。
\src\service\StartService
public class StartServiceTest extends Activity
{
Button start,stop;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取程序界面按钮中的start、stop两个按钮
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
//创建启动Service的Intent
final Intent intent = new Intent();
//为Intent设置Action属性
intent.setAction("com.example.service.FIRST_SERVICE");
start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0)
{
//启动指定Service
startService(intent);
}
});
stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0)
{
//关闭指定Service
stopService(intent);
}
});
}
}
通过以上3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分)。
升华笔记3:
1.为Intent设置Action属性,主要作用是指定启动哪个Service。其中,"com.example.service.FIRST_SERVICE"在Service的AndroidManifest.xml配置文件中的<service../>元素的<intent-filter../>子元素中配置该Service的action属性。
2.该Activity通过Content.startService(Intent intent)方法启动指定的Service,每当Service被创建时会回调onCreate方法,每次Service被启动时都会回调onStart方法--多次启动一个已有的Service组件将不会再回调onCreate方法,但每次启动时都会回调onStartCommand()方法。