Android Service的思考(1)

简介:

在Android框架中,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, TNT All Rights Reserved.  
  12.  */  
  13.    
  14. package com.androidtest.service.mediaplayer;  
  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.     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, TNT 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.    
  29. /**  
  30.  * ClassName:MusicPlayer Function: TODO ADD FUNCTION Reason: TODO ADD REASON  
  31.  *  
  32.  * @author Leon  
  33.  * @version  
  34.  * @since Ver 1.1  
  35.  * @Date 2011-5-15  
  36.  */  
  37. public class NormalMusicPlayerActivity extends Activity implements OnClickListener {  
  38.     private static final String TAG = NormalMusicPlayerActivity.class.getSimpleName();  
  39.     private Intent intent ;  
  40.     @Override  
  41.     protected void onCreate(Bundle savedInstanceState) {  
  42.    
  43.         // TODO Auto-generated method stub  
  44.         super.onCreate(savedInstanceState);  
  45.         this.setContentView(R.layout.music_player_layout);  
  46.         Button playButton = (Button) this.findViewById(R.id.play);  
  47.         playButton.setOnClickListener(this);  
  48.         Button pauseButton =(Button) this.findViewById(R.id.pause);  
  49.         pauseButton.setOnClickListener(this);  
  50.         Button stopButton =(Button)this.findViewById(R.id.stop);  
  51.         stopButton.setOnClickListener(this);  
  52.         Button closeActivityButton =(Button)this.findViewById(R.id.close);  
  53.         closeActivityButton.setOnClickListener(this);  
  54.         Button exitActivityButton =(Button)this.findViewById(R.id.exit);  
  55.         exitActivityButton.setOnClickListener(this);  
  56.    
  57.         intent = new Intent("com.androidtest.service.mediaplayer.NormalMusicService");  
  58.     }  
  59.    
  60.     private void playAction(MyMediaController playType) {  
  61.    
  62.         Bundle bundle = new Bundle();  
  63.         bundle.putSerializable(NormalMusicService.INTENT_KEY, playType);  
  64.         intent.putExtras(bundle);  
  65.         NormalMusicPlayerActivity.this.startService(intent);  
  66.     }  
  67.    
  68.     @Override  
  69.     public void onClick(View view) {  
  70.    
  71.         // TODO Auto-generated method stub  
  72.         switch (view.getId()) {  
  73.         case R.id.play:  
  74.             Log.d(TAG, "play.......");  
  75.             playAction(MyMediaController.play);  
  76.             break;  
  77.         case R.id.pause:  
  78.             Log.d(TAG, "pause.......");  
  79.             playAction(MyMediaController.pause);  
  80.             break;  
  81.         case R.id.stop:  
  82.             Log.d(TAG, "stop.......");  
  83.             playAction(MyMediaController.stop);  
  84.             break;  
  85.         case R.id.close:  
  86.             Log.d(TAG, "close.......");  
  87.             this.finish();  
  88.             break;  
  89.         case R.id.exit:  
  90.             Log.d(TAG, "exit.......");  
  91.             stopService(intent);  
  92.             this.finish();  
  93.    
  94.         }  
  95.    
  96.     }  
  97.    

最后是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, TNT All Rights Reserved.  
  12. */  
  13.    
  14. package com.androidtest.service.mediaplayer;  
  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.    
  23. import com.androidtest.R;  
  24.    
  25. /**  
  26.  * ClassName:MusicService  
  27.  * Function: TODO ADD FUNCTION  
  28.  * Reason:   TODO ADD REASON  
  29.  *  
  30.  * @author   Leon  
  31.  * @version  
  32.  * @since    Ver 1.1  
  33.  * @Date     2011-5-15  
  34.  */  
  35. public class NormalMusicService extends Service{  
  36.    
  37.     private  String  TAG = NormalMusicService.class.getSimpleName();  
  38.     private  MediaPlayer myMediaPlayer ;  
  39.     public   static final  String INTENT_KEY"action" ;  
  40.     @Override  
  41.     public IBinder onBind(Intent arg0) {   
  42.    
  43.         // TODO Auto-generated method stub  
  44.         return null;  
  45.    
  46.     }  
  47.    
  48.     @Override  
  49.     public void onCreate() {  
  50.    
  51.         // TODO Auto-generated method stub  
  52.         Log.v(TAG , TAG+ " onCreate()");  
  53.         super.onCreate();  
  54.         if(myMediaPlayer==null){  
  55.             myMediaPlayer=MediaPlayer.create(this, R.raw.test) ;  
  56.             myMediaPlayer.setLooping(false);  
  57.         }  
  58.     }  
  59.    
  60.     @Override  
  61.     public void onStart(Intent intent, int startId) {  
  62.         // TODO Auto-generated method stub  
  63.         Log.v(TAG , TAG + " onStart()");  
  64.         super.onStart(intent, startId);  
  65.         if(intent!=null){  
  66.             MyMediaController mediaControl =(MyMediaController)intent.getSerializableExtra(NormalMusicService.INTENT_KEY);  
  67.             mediaControl.mediaPlayer=myMediaPlayer;  
  68.             mediaControl.execute();  
  69.         }  
  70.     }  
  71.    
  72.     @Override  
  73.     public void onDestroy() {  
  74.    
  75.         // TODO Auto-generated method stub  
  76.         super.onDestroy();  
  77.         Log.v(TAG , " onDestroy");  
  78.         if(myMediaPlayer!=null){  
  79.             myMediaPlayer.stop();  
  80.             myMediaPlayer.release();  
  81.         }  
  82.    
  83.     }  
  84.    

 


本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718320,如需转载请自行联系原作者

相关文章
|
4月前
|
XML Java Android开发
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
105 0
|
2月前
|
数据可视化 Android开发
[Android 四大组件] --- Service
[Android 四大组件] --- Service
24 0
|
8月前
|
Android开发
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信(一)
Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信
68 0
|
8月前
|
Android开发
Android 四大组件之Service的详解
Android 四大组件之Service的详解
81 0
|
8月前
|
数据库 Android开发 开发者
Android 开发四大组件(Activity、Service、Broadcast Receiver、Content Provider)
Android 开发四大组件(Activity、Service、Broadcast Receiver、Content Provider)
104 0
|
10月前
|
XML 传感器 缓存
Android:四大组件之 Service
Service 是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。但不要被“后台”二字迷惑,Service 默认并不会运行在子线程中,它也不会运行在一个独立的进程中,它同样执行在 UI 线程中,因此,不要在 Service 中执行耗时的操作,除非你在 Service 中创建子线程来完成耗时操作。
94 0
Android:四大组件之 Service
|
Java 调度 Android开发
android Service中Thread.sleep不精确
android Service中Thread.sleep不精确
138 0
|
Android开发
深入剖析Android四大组件(二)——Service服务之启动与绑定(二)
深入剖析Android四大组件(二)——Service服务之启动与绑定(二)
216 1
深入剖析Android四大组件(二)——Service服务之启动与绑定(二)
|
Android开发
深入剖析Android四大组件(二)——Service服务之启动与绑定(一)
深入剖析Android四大组件(二)——Service服务之启动与绑定(一)
164 0
深入剖析Android四大组件(二)——Service服务之启动与绑定(一)
|
编解码 缓存 Android开发
深入剖析Android四大组件(五)——并行执行的Service
深入剖析Android四大组件(五)——并行执行的Service
84 0