一。Service的简单介绍:
Service是Android的四大组件之一,它是运行在后台的服务程序,可以与其它组件进行交互。
二。Service的两种类型:
1):本地服务(Local Service):用于应用程序内部。
2):远程服务(Remote Service):用于Android系统内部应用程序之间。
三。Service的生命周期:
Service的生命周期相对于Activity来说比较简单,OnCreate()--->OnStart()--->OnDestory()阶段。
四。Service的两种启动方式:
1):Context.startService():
调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。
2):Context.bindService():
客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
以下为google官方给出的两种启动方式的对比:
五。下面用一个Demo来说明本地服务的两种形式:
1.不需要和activity交互的本地服务:
MainActivity:
package com.android.douf;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button start,stop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
//启动Service
start.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(MainActivity.this,LocalService.class);
startService(intent);
}
});
//停止Service
stop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(MainActivity.this,LocalService.class);
stopService(intent);
}
});
}
}
LocalService:
package com.android.douf;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class LocalService extends Service
{
private static final String TAG = "LocalService:";
@Override
public IBinder onBind(Intent intent)
{
Log.i(TAG, "onBind");
return null;
}
//创建Service
@Override
public void onCreate()
{
Log.i(TAG, "onCreate");
super.onCreate();
}
//销毁Service
@Override
public void onDestroy()
{
Log.i(TAG, "onDestory");
super.onDestroy();
}
//开始Service
@Override
public void onStart(Intent intent, int startId)
{
Log.i(TAG, "onStart");
super.onStart(intent, startId);
}
}
点击start后点击stop的显示如下:
可以从日志中完全看出Service的整个生命周期。
点击start后再点击start后显示如下:
可以看出当Service创建后到没有停止之前,不管重复使用多少次,都不需要再次调用onCreate(),只需调用onStart()方法。
2.需要和Activity交互的本地服务:
一般情况下我们使用startService()来启动Service,但是这种情况下,我们无法获得Service对象的引用,当我们使用bindService()启动服务时则可以实现此功能。
LocalService:
package com.android.douf;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class LocalService extends Service
{
private IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
public class MyBinder extends Binder
{
LocalService getService()
{
return LocalService.this;
}
}
public void excute()
{
System.out.println("通过Binder得到Service的引用来调用Service内部的方法");
}
@Override
public void onDestroy()
{
// 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent)
{
// 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
System.out.println("调用者退出了");
return super.onUnbind(intent);
}
}
LocalServiceActivity:
package com.android.douf;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
public class LocalServiceActivity extends Activity
{
private LocalService localService;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//将Service和Activity绑定,并启动Service
Intent intent = new Intent(this, LocalService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
private ServiceConnection connection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
//获取Service的对象的引用
localService = ((LocalService.MyBinder) service).getService();
System.out.println("Service连接成功");
localService.excute();
}
@Override
public void onServiceDisconnected(ComponentName name)
{
localService = null;
}
};
@Override
protected void onDestroy()
{
super.onDestroy();
unbindService(connection);
System.out.println("调用者退出绑定");
}
}
这样当我们启动程序后,显示如下:
此时我们可以清楚的看见,我们在Activity中得到了Service对象的引用。