原创 Android笔记14- 四大组件之Service (一)

2014-7-29 20:24 3385 22 22 分类: 软件与OS 文集: Android
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 生命周期
我们可以用下图来了解其生命周期
 
01140101.jpg
 
可以看到, Service 有两种启动方式,一种是 startService() , 一种是 bindService() 。两者的区别在于 startService() 方式是在 退出程序Activity 后 ,如果程序退出时候没有调用stopService() 方法的话,那么Service 依然会在后台运行。而 bindService 则不一样,我们可以通过该方法将 Activity 与 Service 绑定,那么当 Activity 退出时,Service 自然退出。
 
 
我们会用到以下五个函数:
 
01140202.jpg
 
 
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");
  }
 
测试结果:
01140303.jpg
 
 
可以看出,每次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 进行通信。
 
好,现在我们来通过一个实例来了解它:请见下篇
 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
22
关闭 站长推荐上一条 /3 下一条