Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行。
Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的同时也想做下其它的事情,比如上网聊Q、或者上网浏览新闻之类的事情。这样的话,我们就需要用到Service服务了。下面我们以一个简单的音乐播放器的实例来说明下Service的生命周期和Service的使用。
下面是音乐播放器Demo的程序结构图:
Android Service 的生命周期:
Android中Service的生命周期并不是很复杂,只是继承了onCreate(), onStart(), onDestory()三个方法。当我们第一次启动Service服务时,调用onCreate() --> onStart()两个方法,当停止Service服务时,调用onDestory()方法。如果Service已经启动了,第二次再启动同一个服务时,就只是调用 onStart() 这个方法了。
Android Service 的使用:
[1] 参照上面的程序结构图,我们可以创建一个Android程序,在src目录下创建一个Activity,一个继承自Service类的服务类;同时在资源文件夹res目录下创建一个raw的文件夹存放音频文件,如把music.mp3音乐文件放在该目录下。该程序的主界面如下:
[2] layout目录下的main.xml文件的源码:
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
02 | < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
03 | android:orientation = "vertical" |
04 | android:layout_width = "fill_parent" |
05 | android:layout_height = "fill_parent" |
08 | android:layout_width = "fill_parent" |
09 | android:layout_height = "wrap_content" |
10 | android:text = "Welcome to Andy's blog!" |
11 | android:textSize = "16sp" /> |
13 | android:layout_width = "fill_parent" |
14 | android:layout_height = "wrap_content" |
15 | android:text = "音乐播放服务" /> |
17 | android:id = "@+id/startMusic" |
18 | android:layout_width = "wrap_content" |
19 | android:layout_height = "wrap_content" |
20 | android:text = "开启音乐播放服务" /> |
22 | android:id = "@+id/stopMusic" |
23 | android:layout_width = "wrap_content" |
24 | android:layout_height = "wrap_content" |
25 | android:text = "停止音乐播放服务" /> |
27 | android:id = "@+id/bindMusic" |
28 | android:layout_width = "wrap_content" |
29 | android:layout_height = "wrap_content" |
30 | android:text = "绑定音乐播放服务" /> |
32 | android:id = "@+id/unbindMusic" |
33 | android:layout_width = "wrap_content" |
34 | android:layout_height = "wrap_content" |
35 | android:text = "解除 ——绑定音乐播放服务" /> |
[3] src目录下MusicService.java源码:
01 | package com.andyidea.service; |
02 | import android.app.Service; |
03 | import android.content.Intent; |
04 | import android.media.MediaPlayer; |
05 | import android.os.IBinder; |
06 | import android.util.Log; |
07 | import android.widget.Toast; |
08 | public class MusicService extends Service { |
10 | private static String TAG = "MusicService" ; |
12 | private MediaPlayer mPlayer; |
16 | public void onCreate() { |
17 | Toast.makeText( this , "MusicSevice onCreate()" |
18 | , Toast.LENGTH_SHORT).show(); |
19 | Log.e(TAG, "MusicSerice onCreate()" ); |
21 | mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music); |
23 | mPlayer.setLooping( true ); |
28 | public void onStart(Intent intent, int startId) { |
29 | Toast.makeText( this , "MusicSevice onStart()" |
30 | , Toast.LENGTH_SHORT).show(); |
31 | Log.e(TAG, "MusicSerice onStart()" ); |
35 | super .onStart(intent, startId); |
38 | public void onDestroy() { |
39 | Toast.makeText( this , "MusicSevice onDestroy()" |
40 | , Toast.LENGTH_SHORT).show(); |
41 | Log.e(TAG, "MusicSerice onDestroy()" ); |
49 | public IBinder onBind(Intent intent) { |
50 | Toast.makeText( this , "MusicSevice onBind()" |
51 | , Toast.LENGTH_SHORT).show(); |
52 | Log.e(TAG, "MusicSerice onBind()" ); |
60 | public boolean onUnbind(Intent intent) { |
61 | Toast.makeText( this , "MusicSevice onUnbind()" |
62 | , Toast.LENGTH_SHORT).show(); |
63 | Log.e(TAG, "MusicSerice onUnbind()" ); |
67 | return super .onUnbind(intent); |
[4] src目录下MusicServiceActivity源码:
01 | package com.andyidea.service; |
02 | import android.app.Activity; |
03 | import android.content.ComponentName; |
04 | import android.content.Context; |
05 | import android.content.Intent; |
06 | import android.content.ServiceConnection; |
07 | import android.os.Bundle; |
08 | import android.os.IBinder; |
09 | import android.util.Log; |
10 | import android.view.View; |
11 | import android.view.View.OnClickListener; |
12 | import android.widget.Button; |
13 | import android.widget.Toast; |
14 | public class MusicServiceActivity extends Activity { |
17 | private static String TAG = "MusicService" ; |
19 | /** Called when the activity is first created. */ |
21 | public void onCreate(Bundle savedInstanceState) { |
22 | super .onCreate(savedInstanceState); |
23 | setContentView(R.layout.main); |
26 | Toast.makeText( this , "MusicServiceActivity" , |
27 | Toast.LENGTH_SHORT).show(); |
28 | Log.e(TAG, "MusicServiceActivity" ); |
33 | private void initlizeViews(){ |
34 | Button btnStart = (Button)findViewById(R.id.startMusic); |
35 | Button btnStop = (Button)findViewById(R.id.stopMusic); |
36 | Button btnBind = (Button)findViewById(R.id.bindMusic); |
37 | Button btnUnbind = (Button)findViewById(R.id.unbindMusic); |
40 | OnClickListener ocl = new OnClickListener() { |
43 | public void onClick(View v) { |
45 | Intent intent = new Intent(MusicServiceActivity. this ,MusicService. class ); |
57 | bindService(intent, conn, Context.BIND_AUTO_CREATE); |
59 | case R.id.unbindMusic: |
68 | btnStart.setOnClickListener(ocl); |
69 | btnStop.setOnClickListener(ocl); |
70 | btnBind.setOnClickListener(ocl); |
71 | btnUnbind.setOnClickListener(ocl); |
75 | final ServiceConnection conn = new ServiceConnection() { |
78 | public void onServiceDisconnected(ComponentName name) { |
79 | Toast.makeText(MusicServiceActivity. this , "MusicServiceActivity onSeviceDisconnected" |
80 | , Toast.LENGTH_SHORT).show(); |
81 | Log.e(TAG, "MusicServiceActivity onSeviceDisconnected" ); |
85 | public void onServiceConnected(ComponentName name, IBinder service) { |
86 | Toast.makeText(MusicServiceActivity. this , "MusicServiceActivity onServiceConnected" |
87 | ,Toast.LENGTH_SHORT).show(); |
88 | Log.e(TAG, "MusicServiceActivity onServiceConnected" ); |
[5] 最后,我们别忘了在AndroidManifest.xml配置文件中添加对Service的注册。即在application节点中添加
<service android:name=".MusicService"/> 进行注册。
[6] 我们来看下程序运行后的Log.e中显示的Service生命周期
[7] 我们在Android终端设备中查看下刚才启动的音乐播放服务,看看我们退出程序后,是不是该程序的服务还在运行的呢?按如下步骤:Menu --> Settings --> Applications --> Running services 。在弹出的 Running services 中可以看到有哪些服务在运行。
这样我们就看到我们退出程序后,是由于该服务还在后台运行着,所以我们的音乐还可以继续播放着。就这样,我们就可以一边享受音乐,一边可以聊QQ,或者浏览新闻等等。