1、初初了解
Android应用程序的四大组件分别是Activity、Service、BroadcastReceiver和ContentProvider,其中Service 是 Android 四大组件中与 Acitivity 最为相似的组件,他们都是可执行的程序,他们都是从Context 派生出来的,所以他们都可以调用 Context 里定义的如getResource()等方法,所不同的就是 Service没有用户界面,一直在后台运行。他有自己的生命周期。那么我们该怎么 去现则 Service 还是 Activity 呢?
一个标准就是:当该程序需要与用户交互时,就该使用 Actibity , 否则就应该考虑使用 Service 。如果我不需要在前台显示的计算或者数据处理时,就可以启动一个Service 来实现了。
开发Service 与开发 Activity 步骤很像:
(1)开发一个 Service 的子类;
(2)在 AndroidManifest.xml 中配置该Service , 配置时可通过 元素指定它可被哪些Intent 启动。
Service 有两种应用目的,分别是后台运行和跨进程访问。所以,Service 分为两种,一种是绑定服务 bound Service ;
一种是 AIDL (Android Interface Defination Language) 服务实现不同进程之间的通信。
2、Service 生命周期
我们可以用下图来了解其生命周期
可以看到, Service 有两种启动方式,一种是 startService() , 一种是 bindService() 。两者的区别在于 startService() 方式是在 退出程序Activity 后 ,如果程序退出时候没有调用stopService() 方法的话,那么Service 依然会在后台运行。而 bindService 则不一样,我们可以通过该方法将 Activity 与 Service 绑定,那么当 Activity 退出时,Service 自然退出。
我们会用到以下五个函数:
3、 startService() 启动方法示例:
因为 Service 不能自启动,所以必须建立一个Activity 来启动和停止 Service 。
(1)创建 启动Service 的 Intent
final Intent intent = new Intent();
(2)设置该 Intent 要启动哪个 Service ;
这个要在Manifest.xml 文件中进行设置。 把以下内容加到 后面去:
//粗体为你的Service 文件名字
接着咱们就可以在 Activity 的JAVA 文件中指定intent 的目的地了。
intent.setAction(“com.example.FIRST_SERVICE”); //括号里的名字一定要和Manifest.xml 里的名字一致。
(3)用一个按钮 (起名为start)来 启动 Service
start.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 启动指定Serivce
startService(intent);
}
});
(4)用一个按钮(起名为stop)来停止Service
stop.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 停止指定Serivce
stopService(intent);
}
});
(5)新建一个名为 FirstSerce 的Java 文件,继承于Service
(6)重写onCreate方法,写具体后台任务
@Override
public void onCreate()
{
super.onCreate();
//这里写要进行后台任务
}
(7)重写 onStartCommand 方法,启动任务
// Service被启动时回调该方法
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
//System.out.println("Service is Started");
Log.d("Service", "Service is Started");
return START_STICKY;
}
(8)重写onDestroy 方法,销毁Service
@Override
public void onDestroy()
{
super.onDestroy();
// System.out.println("Service is Destroyed");
Log.d("Service", "Service is destroyed");
}
测试结果:
可以看出,每次Service 被创建时会回调 onCreate() 方法,而每次 Service 被启动时候,都会回调 onStart 方法。
多次启动不会再回调onCreate() 方法,但是每次启动会回调 onStartCommand 方法。
Service 部分代码如下:
public class FirstService extends Service {
public FirstService() {
// TODO Auto-generated constructor stub
}
@Override
public void onCreate()
{
super.onCreate();
//这里写要进行后台任务
Log.i("TEST","Service is created!");
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
// Service被启动时回调该方法
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
//System.out.println("Service is Started");
Log.i("Service", "Service is Started");
return START_STICKY;
}
// Service被关闭之前回调。
@Override
public void onDestroy()
{
super.onDestroy();
Log.i("Service", "Service is destroyed");
}
}
4、bindService() 启动方法示例
从上面示例可以看出,startService() 和 stopService 只是启动与关闭,中间Service 无论运行怎样的任务,都和用户没有信息的交互,通信等。如果Service 与用户之间一定要有 方法调用或者数据交换的话,就应该采用bindService() 方法来启动 Service 。
有必要先介绍下 bindService()的完整方法:
public abstract boolean bindService (Intent service, ServiceConnection conn, int flags)
-
service 是Intent 要启动的Service ;
-
conn 是一个ServiceConnection 对象,当Service 与用户连接成功则返回 ServiceConnection 对象的 onServicreConnected方法,如果连接不成功,则 ServiceConnection 对象的 onServicreDisconnected方法;
-
flags 该值要么为0 要么为 BIND_AUTO_CREATE ,意思就是指定绑定时如果Service 还没创建的话,是否自动创建Service ,0是不创建,后者是创建。
注意到 onServiceConnected 方法中有一个 IBinder 对象,它就是用来实现与被绑定Service 之间的通信。
当我们开发一个 Service 类的时候,该 Service 类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service 的情况下, onBind(Intent intent) 方法所返回的 IBinder 对象将会传给 ServiceConnection方法里的service 参数,如此,我们就可以通过 IBinder 对象与 Service 进行通信。
好,现在我们来通过一个实例来了解它:请见下篇
文章评论(0条评论)
登录后参与讨论