深入浅出 Android核心组件Service(1)

移动开发 Android
在Android框架中,Service是比较难以理解的一部分,而网上的大多数资料最多就是讲述了如何去用Service,并没有对Service做一个深入的、系统的讲解。现在傻蛋将做一个系列文章,将对Service做一个由浅入深的梳理,帮助大家深入的掌握Android Service。

首先我们先来看看怎么使用Service,然后再谈Android Service的内部机制。

在Android中Service的启动方式有两种,今天先发第一种。

Service的启动方式一:

启动:Context.startService(new Intent(context,xxx.class));

停止:Context.stopService() ;

我画了一个Service启动的流程图,相信大家一看就懂。Activity通过 Intent启动Service,如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果 Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 调用stopService就会触发Service的onDestroy()方法。

这一节里面傻蛋做了一个示例程序是一个音乐播放器,界面如下,功能很简单:播放、暂停、停止音乐、关闭Activity(这时Service仍然运行,继续播放音乐)、退出程序(停止音乐退出Activity)。

由于要控制Service的动作,傻蛋写了一个播放的通用类,这样在以后的课程中还能用上,代码如下:

  1. /** 
  2.  * MyMediaController.java 
  3.  * com.androidtest.service.mediaplayer 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2011-5-16      Leon 
  10.  * 
  11.  * Copyright (c) 2011, 最牛网 All Rights Reserved. 
  12.  */ 
  13.  
  14. package com.zuiniuwang; 
  15.  
  16. import java.io.Serializable; 
  17.  
  18. import android.media.MediaPlayer; 
  19.  
  20. /** 
  21.  * ClassName:MyMediaController  
  22.  * Function: Mediaplayer 的一个控制类,控制播放器的播放 暂停 停止 等动作 
  23.  * REASON 
  24.  *  
  25.  * @author Leon 
  26.  * @version 
  27.  * @since Ver 1.1 
  28.  * @Date 2011-5-16 
  29.  */ 
  30. public enum MyMediaController implements Serializable { 
  31.     play { 
  32.         @Override 
  33.         public void execute() { 
  34.             if (mediaPlayer != null && !mediaPlayer.isPlaying()) 
  35.                 mediaPlayer.start(); 
  36.             // TODO Auto-generated method stub 
  37.         } 
  38.  
  39.     }, 
  40.     pause { 
  41.  
  42.         @Override 
  43.         public void execute() { 
  44.  
  45.             // TODO Auto-generated method stub 
  46.             if (mediaPlayer != null && mediaPlayer.isPlaying()) { 
  47.                 mediaPlayer.pause(); 
  48.             } 
  49.         } 
  50.  
  51.     }, 
  52.     stop { 
  53.         @Override 
  54.         public void execute() { 
  55.             // TODO Auto-generated method stub 
  56.             if (mediaPlayer != null) { 
  57.                 mediaPlayer.stop(); 
  58.                 try { 
  59.                     // 在stop后如果要重新Start需要prepare一下 
  60.                     mediaPlayer.prepare(); 
  61.                     // 从头播放 
  62.                     mediaPlayer.seekTo(0); 
  63.  
  64.                 } catch (Exception e) { 
  65.  
  66.                     // TODO Auto-generated catch block 
  67.                     e.printStackTrace(); 
  68.  
  69.                 } 
  70.             } 
  71.         } 
  72.  
  73.     }; 
  74.     public static MediaPlayer mediaPlayer; 
  75.  
  76.  
  77.     public abstract void execute(); 

然后是控制播放的Activity:

  1. /** 
  2.  * MusicPlayer.java 
  3.  * com.androidtest.activity 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2011-5-15      Leon 
  10.  * 
  11.  * Copyright (c) 2011, 最牛网 All Rights Reserved. 
  12.  */ 
  13.  
  14. package com.androidtest.activity.musicplayer; 
  15.  
  16. import android.app.Activity; 
  17. import android.content.Intent; 
  18. import android.os.Bundle; 
  19. import android.util.Log; 
  20. import android.view.View; 
  21. import android.view.View.OnClickListener; 
  22. import android.widget.Button; 
  23.  
  24. import com.androidtest.MyImageButton; 
  25. import com.androidtest.R; 
  26. import com.androidtest.service.mediaplayer.MyMediaController; 
  27. import com.androidtest.service.mediaplayer.NormalMusicService; 
  28. import com.androidtest.sharedpreferences.TestSharePreferences; 
  29.  
  30.  
  31.  
  32.  
  33. /** 
  34.  * ClassName:MusicPlayer Function: TODO ADD FUNCTION Reason: TODO ADD REASON 
  35.  *  
  36.  * @author Leon 
  37.  * @version 
  38.  * @since Ver 1.1 
  39.  * @Date 2011-5-15 
  40.  */ 
  41. public class NormalMusicPlayerActivity extends Activity implements OnClickListener { 
  42.     private static final String TAG = NormalMusicPlayerActivity.class.getSimpleName(); 
  43.     private Intent intent ; 
  44.     @Override 
  45.     protected void onCreate(Bundle savedInstanceState) { 
  46.  
  47.         // TODO Auto-generated method stub 
  48.         super.onCreate(savedInstanceState); 
  49.         this.setContentView(R.layout.music_player_layout); 
  50.         Button playButton = (Button) this.findViewById(R.id.play); 
  51.         playButton.setOnClickListener(this); 
  52.         Button pauseButton =(Button) this.findViewById(R.id.pause); 
  53.         pauseButton.setOnClickListener(this); 
  54.         Button stopButton =(Button)this.findViewById(R.id.stop); 
  55.         stopButton.setOnClickListener(this); 
  56.         Button closeActivityButton =(Button)this.findViewById(R.id.close); 
  57.         closeActivityButton.setOnClickListener(this); 
  58.         Button exitActivityButton =(Button)this.findViewById(R.id.exit); 
  59.         exitActivityButton.setOnClickListener(this); 
  60.          
  61.         intent = new Intent("com.androidtest.service.mediaplayer.NormalMusicService"); 
  62.          
  63.         TestSharePreferences testSharePreferences=(TestSharePreferences)this.getApplication(); 
  64.         Log.v(TAG , ""+testSharePreferences.getSharedInteger()); 
  65.     } 
  66.  
  67.     private void playAction(MyMediaController playType) { 
  68.          
  69.         Bundle bundle = new Bundle(); 
  70.         bundle.putSerializable(NormalMusicService.INTENT_KEY, playType); 
  71.         intent.putExtras(bundle); 
  72.         NormalMusicPlayerActivity.this.startService(intent); 
  73.     } 
  74.  
  75.     @Override 
  76.     public void onClick(View view) { 
  77.  
  78.         // TODO Auto-generated method stub 
  79.         switch (view.getId()) { 
  80.         case R.id.play: 
  81.             Log.d(TAG, "play......."); 
  82.             playAction(MyMediaController.play); 
  83.             break
  84.         case R.id.pause: 
  85.             Log.d(TAG, "pause......."); 
  86.             playAction(MyMediaController.pause); 
  87.             break
  88.         case R.id.stop: 
  89.             Log.d(TAG, "stop......."); 
  90.             playAction(MyMediaController.stop); 
  91.             break
  92.         case R.id.close: 
  93.             Log.d(TAG, "close......."); 
  94.             this.finish(); 
  95.             break
  96.         case R.id.exit: 
  97.             Log.d(TAG, "exit......."); 
  98.             stopService(intent); 
  99.             this.finish(); 
  100.      
  101.         } 
  102.  
  103.     } 
  104.  

最后是Service类

  1. /** 
  2.  * MusicService.java 
  3.  * com.androidtest.service 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2011-5-15      Leon 
  10.  * 
  11.  * Copyright (c) 2011, 最牛网 All Rights Reserved. 
  12. */ 
  13.  
  14. package com.zuiniuwang.service; 
  15. import java.io.Serializable; 
  16.  
  17. import android.app.Service; 
  18. import android.content.Intent; 
  19. import android.media.MediaPlayer; 
  20. import android.os.IBinder; 
  21. import android.util.Log; 
  22. import com.zuiniuwang.*; 
  23.  
  24.  
  25.  
  26. /** 
  27.  * ClassName:MusicService 
  28.  * Function: TODO ADD FUNCTION 
  29.  * Reason:   TODO ADD REASON 
  30.  * 
  31.  * @author   Leon 
  32.  * @version   
  33.  * @since    Ver 1.1 
  34.  * @Date     2011-5-15 
  35.  */ 
  36. public class NormalMusicService extends Service{ 
  37.  
  38.     private  String  TAG = NormalMusicService.class.getSimpleName(); 
  39.     private  MediaPlayer myMediaPlayer ; 
  40.     public   static final  String INTENT_KEY= "action" ; 
  41.     @Override 
  42.     public IBinder onBind(Intent arg0) {  
  43.          
  44.         // TODO Auto-generated method stub 
  45.         return null
  46.          
  47.     } 
  48.  
  49.     @Override 
  50.     public void onCreate() { 
  51.          
  52.         // TODO Auto-generated method stub 
  53.         Log.v(TAG , TAG+ " onCreate()"); 
  54.         super.onCreate(); 
  55.         if(myMediaPlayer==null){ 
  56.             myMediaPlayer=MediaPlayer.create(this, R.raw.test) ;  
  57.             myMediaPlayer.setLooping(false); 
  58.         } 
  59.     } 
  60.  
  61.     @Override 
  62.     public void onStart(Intent intent, int startId) {    
  63.         // TODO Auto-generated method stub 
  64.         Log.v(TAG , TAG + " onStart()"); 
  65.         super.onStart(intent, startId); 
  66.         if(intent!=null){ 
  67.             MyMediaController mediaControl =(MyMediaController)intent.getSerializableExtra(NormalMusicService.INTENT_KEY); 
  68.             mediaControl.mediaPlayer=myMediaPlayer; 
  69.             mediaControl.execute(); 
  70.         } 
  71.     } 
  72.  
  73.      
  74.     @Override 
  75.     public void onDestroy() { 
  76.          
  77.         // TODO Auto-generated method stub 
  78.         super.onDestroy(); 
  79.         Log.v(TAG , " onDestroy"); 
  80.         if(myMediaPlayer!=null){ 
  81.             myMediaPlayer.stop(); 
  82.             myMediaPlayer.release(); 
  83.         } 
  84.          
  85.     } 
  86.      

附件为本实例的代码下载地址:http://down.51cto.com/data/326354

责任编辑:佚名 来源: 最牛网
相关推荐

2012-02-07 15:09:03

Android核心组件Service

2012-02-07 15:16:01

Android核心组件Service

2012-02-07 15:29:17

Android核心组件Service

2012-02-07 14:45:52

Android核心组件Service

2012-02-21 13:55:45

JavaScript

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2011-05-05 14:44:43

SurfaceFlinSurfaceActivity

2013-11-14 15:53:53

AndroidAudioAudioFlinge

2022-05-06 07:19:11

DOMDiff算法

2009-06-04 20:08:26

Eclipse RCPEclipse

2021-07-20 15:20:02

FlatBuffers阿里云Java

2019-01-07 15:29:07

HadoopYarn架构调度器

2012-05-21 10:06:26

FrameworkCocoa

2017-07-02 18:04:53

块加密算法AES算法

2022-09-26 09:01:15

语言数据JavaScript

2022-01-13 09:38:25

Android架构设计

2022-12-02 09:13:28

SeataAT模式

2018-11-09 16:24:25

物联网云计算云系统

2022-01-11 07:52:22

CSS 技巧代码重构
点赞
收藏

51CTO技术栈公众号