Android小项目之--服务【Service】

来源:互联网 发布:c语言小游戏.pdf 编辑:程序博客网 时间:2024/06/05 08:07
Service 简介
何谓“Service”?“Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,有些服务是在后台上运行,干着静悄悄的勾当不让人知道 。与 Activity 不同,Service 是并不直接与用户交互的运行于后台的一类组件。

  Google对Service的解释
  • 一个服务不是一个单独的进程。服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中。
  • 一个服务不是一个单独的线程。它是一种手段,本身做着主线的工作 (以避免应用程序没有响应的错误)。
  Service 与 Activity 的相同点与不同点
  • 不同点:Activity是与用户交互的组件,即我们用眼睛可以看到的界面,而Service是在后台运行,执行隐藏的动作。
  • 相同点:使用Activity 时我们需要在配置文件中声明<activity>标签,同样的使用Service 也需要在配置文件中声明<service>标签
  使用Service
创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:
  • onCreate()
    创建
  • onStart()
    开始
  • onDestry()
    释放
注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。但两种方法的Service生命周期是不同的,下面我们通过一个小例子来区别各自的生命周期。
例子效果图如下:
代码如下:

  1. package com.terry;

  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.IBinder;
  5. import android.util.Log;

  6. public class ServiceSample extends Service {

  7.     final String TAG="Service";
  8.     @Override
  9.     public IBinder onBind(Intent intent) {
  10.         // TODO Auto-generated method stub
  11.         Log.i(TAG,"onBind");
  12.         return null;
  13.     }
  14.     
  15.     @Override
  16.     public boolean onUnbind(Intent intent) {
  17.         // TODO Auto-generated method stub
  18.         Log.i(TAG, "onUnbind");
  19.         return super.onUnbind(intent);
  20.     }

  21.     @Override
  22.     public void onRebind(Intent intent) {
  23.         // TODO Auto-generated method stub 
  24.         super.onRebind(intent);
  25.         Log.i(TAG, "onRebind");
  26.     }
  27.     @Override
  28.     public void onCreate() {
  29.         // TODO Auto-generated method stub
  30.         super.onCreate();
  31.         Log.i(TAG, "onCreate");
  32.     }
  33.     @Override
  34.     public void onDestroy() {
  35.         // TODO Auto-generated method stub
  36.         super.onDestroy();
  37.         Log.i(TAG, "onDestroy");
  38.     }
  39.     
  40.     @Override
  41.     public void onStart(Intent intent, int startId) {
  42.         // TODO Auto-generated method stub
  43.         super.onStart(intent, startId);
  44.         Log.i(TAG, "onStart");
  45.     }
  46.     
  47. }
复制代码

当调用startService方法时:
  • 1、若Servcie没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。
  • 2、若Service己经启动则首先会直接调用onStart方法,
  • 3、关闭时使用stopservice来关闭。

当调用bindService方法时:
  • 1、若Service没有启动,则首先调用onCreate方法,来初始化启动Service,然后调用Service的onBind。
  • 2、通过onUnbind和onDestry方法停止Service运行。

下面通过一组图来更详细的说明Service的生命周期 
开始服务

 
停止服务
 
绑定服务
 
销毁服务 

音乐服务DEMO通过上面的小例子可能有些园友还是很模糊,下面通过一个播放音乐的小例子加深大家对Service 的理解,该例子通过播放一首mp3 ,当用户点击开始“按钮”,音乐开始播放,即时你退出程序音乐也会播放,点击“停止”按钮,停止播放音乐 。该例子继承service 然后重写onStart播放音乐 重写onDestry停止音乐 ,代码如下:
  1. package com.terry;

  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.media.MediaPlayer;
  5. import android.os.IBinder;

  6. public class musicServer extends  Service {

  7.     private MediaPlayer player;
  8.     @Override
  9.     public IBinder onBind(Intent intent) {
  10.         // TODO Auto-generated method stub
  11.         return null;
  12.     }
  13.     
  14.     @Override
  15.     public void onStart(Intent intent, int startId) {
  16.         // TODO Auto-generated method stub
  17.         super.onStart(intent, startId);
  18.     if(player==null)
  19.     {
  20.         player=MediaPlayer.create(this, R.raw.start);
  21.         player.start();
  22.     }
  23.     }
  24.     
  25.     @Override
  26.     public void onDestroy() {
  27.         // TODO Auto-generated method stub
  28.         super.onDestroy();
  29.         player.stop();
  30.     }
  31. }
复制代码
完成了service类,我们只要在对应的Activity的事件中调用服务即可实现,代码如下:
  1. package com.terry;

  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;

  8. public class musicActivity  extends Activity{

  9.     private Intent intent=new Intent("com.terry.Android.MUSIC"); 
  10.     
  11.     @Override
  12.     protected void onCreate(Bundle savedInstanceState) {
  13.         // TODO Auto-generated method stub
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(R.layout.music);
  16.         findView();
  17.         viewHolder.myButton.setOnClickListener(new OnClickListener() {
  18.             
  19.             @Override
  20.             public void onClick(View v) {
  21.                 // TODO Auto-generated method stub
  22.                 startService(intent);
  23.             }
  24.         });
  25.         
  26.         viewHolder.myButton2.setOnClickListener(new OnClickListener() {
  27.             
  28.             @Override
  29.             public void onClick(View v) {
  30.                 // TODO Auto-generated method stub
  31.                 stopService(intent);
  32.             }
  33.         });
  34.     }
  35.     
  36.     
  37.     void findView(){
  38.         viewHolder.myButton=(Button)findViewById(R.id.play);
  39.         viewHolder.myButton2=(Button)findViewById(R.id.stop);
  40.     }
  41. }
复制代码

运行效果图:

0 0
原创粉丝点击