android Service实例

来源:互联网 发布:变色龙制作淘宝客app 编辑:程序博客网 时间:2024/04/30 01:39
 

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文件的源码:

view source
print?
01<?xmlversion="1.0"encoding="utf-8"?>
02<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
03    android:orientation="vertical"
04    android:layout_width="fill_parent"
05    android:layout_height="fill_parent"
06    >
07    <TextView  
08       android:layout_width="fill_parent" 
09       android:layout_height="wrap_content" 
10       android:text="Welcome to Andy's blog!"
11       android:textSize="16sp"/>   
12    <TextView  
13       android:layout_width="fill_parent" 
14       android:layout_height="wrap_content" 
15       android:text="音乐播放服务"/>
16    <Button
17       android:id="@+id/startMusic" 
18       android:layout_width="wrap_content"
19       android:layout_height="wrap_content"
20       android:text="开启音乐播放服务"/>
21    <Button
22       android:id="@+id/stopMusic" 
23       android:layout_width="wrap_content"
24       android:layout_height="wrap_content"
25       android:text="停止音乐播放服务"/>
26   <Button
27      android:id="@+id/bindMusic" 
28      android:layout_width="wrap_content"
29      android:layout_height="wrap_content"
30      android:text="绑定音乐播放服务"/>
31   <Button
32      android:id="@+id/unbindMusic" 
33      android:layout_width="wrap_content"
34      android:layout_height="wrap_content"
35      android:text="解除 ——绑定音乐播放服务"/>
36</LinearLayout>

[3] src目录下MusicService.java源码:
view source
print?
01package com.andyidea.service;
02import android.app.Service;
03import android.content.Intent;
04import android.media.MediaPlayer;
05import android.os.IBinder;
06import android.util.Log;
07import android.widget.Toast;
08public class MusicService extendsService {
09    //为日志工具设置标签
10    privatestatic String TAG = "MusicService";
11    //定义音乐播放器变量
12    privateMediaPlayer mPlayer;
13      
14    //该服务不存在需要被创建时被调用,不管startService()还是bindService()都会启动时调用该方法
15    @Override
16    publicvoid onCreate() {
17        Toast.makeText(this,"MusicSevice onCreate()"
18                , Toast.LENGTH_SHORT).show();
19        Log.e(TAG,"MusicSerice onCreate()");
20          
21        mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
22        //设置可以重复播放
23        mPlayer.setLooping(true);
24        super.onCreate();
25    }
26      
27    @Override
28    publicvoid onStart(Intent intent,int startId) {
29        Toast.makeText(this,"MusicSevice onStart()"
30                , Toast.LENGTH_SHORT).show();
31        Log.e(TAG,"MusicSerice onStart()");
32          
33        mPlayer.start();
34          
35        super.onStart(intent, startId);
36    }
37    @Override
38    publicvoid onDestroy() {
39        Toast.makeText(this,"MusicSevice onDestroy()"
40                , Toast.LENGTH_SHORT).show();
41        Log.e(TAG,"MusicSerice onDestroy()");
42          
43        mPlayer.stop();
44          
45        super.onDestroy();
46    }
47    //其他对象通过bindService 方法通知该Service时该方法被调用
48    @Override
49    publicIBinder onBind(Intent intent) {
50        Toast.makeText(this,"MusicSevice onBind()"
51                , Toast.LENGTH_SHORT).show();
52        Log.e(TAG,"MusicSerice onBind()");
53          
54        mPlayer.start();
55          
56        returnnull;
57    }
58    //其它对象通过unbindService方法通知该Service时该方法被调用
59    @Override
60    publicboolean onUnbind(Intent intent) {
61        Toast.makeText(this,"MusicSevice onUnbind()"
62                , Toast.LENGTH_SHORT).show();
63        Log.e(TAG,"MusicSerice onUnbind()");
64          
65        mPlayer.stop();
66          
67        returnsuper.onUnbind(intent);
68    }
69      
70}

[4] src目录下MusicServiceActivity源码:

view source
print?
01package com.andyidea.service;
02import android.app.Activity;
03import android.content.ComponentName;
04import android.content.Context;
05import android.content.Intent;
06import android.content.ServiceConnection;
07import android.os.Bundle;
08import android.os.IBinder;
09import android.util.Log;
10import android.view.View;
11import android.view.View.OnClickListener;
12import android.widget.Button;
13import android.widget.Toast;
14public class MusicServiceActivity extendsActivity {
15      
16    //为日志工具设置标签
17    privatestatic String TAG = "MusicService";
18      
19    /** Called when the activity is first created. */
20    @Override
21    publicvoid onCreate(Bundle savedInstanceState) {
22        super.onCreate(savedInstanceState);
23        setContentView(R.layout.main);
24          
25        //输出Toast消息和日志记录
26        Toast.makeText(this,"MusicServiceActivity",
27                Toast.LENGTH_SHORT).show();
28        Log.e(TAG,"MusicServiceActivity");
29          
30        initlizeViews();
31    }
32      
33    privatevoid 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);
38          
39        //定义点击监听器
40        OnClickListener ocl =new OnClickListener() {
41              
42            @Override
43            publicvoid onClick(View v) {
44                //显示指定  intent所指的对象是个   service
45                Intent intent =new Intent(MusicServiceActivity.this,MusicService.class);
46                switch(v.getId()){
47                caseR.id.startMusic:
48                    //开始服务
49                    startService(intent);
50                    break;
51                caseR.id.stopMusic:
52                    //停止服务
53                    stopService(intent);
54                    break;
55                caseR.id.bindMusic:
56                    //绑定服务
57                    bindService(intent, conn, Context.BIND_AUTO_CREATE);
58                    break;
59                caseR.id.unbindMusic:
60                    //解绑服务
61                    unbindService(conn);
62                    break;
63                }
64            }
65        };
66          
67         //绑定点击监听
68        btnStart.setOnClickListener(ocl);
69        btnStop.setOnClickListener(ocl);
70        btnBind.setOnClickListener(ocl);
71        btnUnbind.setOnClickListener(ocl);
72    }
73      
74    //定义服务链接对象
75    finalServiceConnection conn = newServiceConnection() {
76          
77        @Override
78        publicvoid onServiceDisconnected(ComponentName name) {
79            Toast.makeText(MusicServiceActivity.this,"MusicServiceActivity onSeviceDisconnected"
80                    , Toast.LENGTH_SHORT).show();
81            Log.e(TAG,"MusicServiceActivity onSeviceDisconnected");
82        }
83          
84        @Override
85        publicvoid onServiceConnected(ComponentName name, IBinder service) {
86            Toast.makeText(MusicServiceActivity.this,"MusicServiceActivity onServiceConnected"
87                    ,Toast.LENGTH_SHORT).show();
88            Log.e(TAG,"MusicServiceActivity onServiceConnected");
89        }
90    };
91}

[5] 最后,我们别忘了在AndroidManifest.xml配置文件中添加对Service的注册。即在application节点中添加

      <service android:name=".MusicService"/> 进行注册。

[6] 我们来看下程序运行后的Log.e中显示的Service生命周期

[7] 我们在Android终端设备中查看下刚才启动的音乐播放服务,看看我们退出程序后,是不是该程序的服务还在运行的呢?按如下步骤:Menu --> Settings --> Applications --> Running services 。在弹出的 Running services 中可以看到有哪些服务在运行。

这样我们就看到我们退出程序后,是由于该服务还在后台运行着,所以我们的音乐还可以继续播放着。就这样,我们就可以一边享受音乐,一边可以聊QQ,或者浏览新闻等等。

原创粉丝点击