ANDROID下的四大组件之服务SERVICE
这篇文章主要讲解一些Android service入门基础知识,希望带大家走进Android service的大门。
1.什么是服务
服务是Android中为了实现程序后台运行的解决方案,非常适合执行那些不需要和用户交互而且还要求长期运行的程序。服务的运行不依赖任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务仍然能够保持正常运行。
2.如何定义服务
通常我们会新建一个类,让其继承Service
如:
public class MyService extends Service{
public IBinder onBind(Intent intent){
}
public void onCreate(){
}
public int onStartCommand(Intent intnt,int flags,int startId){
return super.onStartCommand(intente,flags,startId)
}
public void onDestory(){
super.onDestory();
}
}
onCreate()在服务创建的时候启动,onStratCommand()会在服务启动的时候启动,onDestory()会在服务销毁的时候调用。
3.如何启动服务
首先要在AndroidManifest中注册service,如:
<service name="。MyService">
</service>
启动服务需要通过方法startService(Intent),如startService(new Intent(this,MyService.class));
停止服务则需要通过方法stopService(Intnet),如stopService(new Intent(this,MyService.class));
启动服务后会先调用onCreate(),然后再调用onStartCommand()。其中onCreate()在第一次创建service的时候会调用,而onStartCommand()每次启动服务的时候都会调用。
4.服务如何和活动进行通信
虽然我们通过startService启动了服务,但是这也只是单单的运行服务,没有和活动进行任何联系,所以现在我们要让服务和活动进行通信。
这里让两者联系起来需要用到之前提到过的onBind(),但是我们首先要在继承了Service的类中,创建一个继承了Binder的内部类,该内部类中写上需要活动用到的方法,如查看下载进度的getProgress()和开始下载的startDownload()等,为了让活动能获取到该类的实例,我们还需要创建一个实例,在onBind()中返回该实例。整体的例子:
public class LocalService extends Service {
public class DownloadBinder extends Binder{
public void startDownload(){
Log.d("MyService","startDownload execute");
}
public int getProgress(){
return 0;
}
}
public DownloadBinder mBinder=new DownloadBinder();
@Override
public IBinder onBind(Intent intent) {
// 返回 SimpleBinder 对象
return mBinder;
}
}
那么接下来活动如何获取Binder呢?
我们只要在活动中调用onBind(Intnet,serviceConnection,BIND_AUTO_CREATE)就可以让服务和活动绑定在一起,从而让活动调用服务中的方法。
这其中第二个参数serviceConnection需要我们在活动中创建出来,我们需要在活动中创建其匿名类,然后其中有两个方法,一个为onServiceConnected(),另一个为onServiceDisconnected(),
我们需要在onServiceConnected()中通过向下转型获取到服务中的Binder,然后通过Binder调用服务中的方法。
第三个参数是一个标志位,BIND_AUTO_CREATE代表活动和服务在绑定后自动创建服务。
如果需要解绑服务,调用unbindService(serviceConnection);
例子
ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.DownloadBinder mBinder = (MyService.DownloadBinder)service;
}
};
findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindService(new Intent(Main.this,MyService.class), sc, Context.BIND_AUTO_CREATE);
isBind = true;
}
});
findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isBind){
unbindService(sc);
isBind = false;
}
}
});
5.服务的生命周期
只启动的服务:onCreate()→onStartCommand()→onDestory()
如果被startService()多次启动,onCreate()只执行一次,onStart()多次执行,只创建Service的一个实例。
只绑定的服务:onCreate()→onBind→onUnbind()→onDestory()
bindService()多次调用,onCreate()只调用一次,除非调用unBindService(),否则Service一直运行。
即启动又绑定的服务:onCreate()→onStartCommand()→onBind()→onUnBind()→onDestory()
onCreate()必定只执行一次,startService调用几次则执行几次onStartCommand(),调用unbind不会停止service,必须stopService或Service的stopself()停止服务。
文章来自:博客园/shawdo