Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1078276
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-03-06 16:02:17

/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。      
 ********************************************************************************************/

1、首先service如windows下面的服务是差不多的,没有用户界面,只是在后台工作。


2、看一下service的继承关系

 


3、service本身不能自己启动,要调用其他方法才能启动service。有如下两种方法

           a、Context.startService()

             使用这个方法时,service与启动者是没有关系的,只是单纯的启动service,若启动者退出了,service依旧在后台运行。

           (如音乐播放,即使退出了程序,音乐还在播放着)


            b、Context.bindService()

          使用此方法时,顾名思义,就是把启动者与service绑定在一起了,启动者退出,service也跟着停止。


4、service的生命周期


         a、采用startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时会自动调用onDestroy()方法。

          b、采用bindService()方法启动的服务,可以调用unbindService()方法来解绑,调用该方法时,也会同时导致系统自动调用服务的onUnbind()和onDestroy()方法.


  1. //Context.startService方式的生命周期:  
  2. 启动时,调用startService方法 –>onCreate() –> onStart()  
  3. 停止时,调用stopService 方法 –> onDestroy()  
  4.   
  5. //Context.bindService方式的生命周期:  
  6. 绑定时,调用bindService方法  ->onCreate() –> onBind()  
  7. 解绑定时,调用unbindService方法 –>onUnbind() –> onDestory(  

Service的生命周期方法比Activity少,只有onCreate, onStart, onDestroy 。


5、简单音乐播放例子

MP3文件在res目录下的raw目录里面,拖动mp3文件进去即可。(raw为自己新建)

文件格式为mp3和ogg,文件名为0~9或者a~z,比特率最好低于或等于320kps

  1. //第一个Activity  
  2. package conowen.szu.Service;  
  3.   
  4. import android.app.Activity;  
  5. import android.content.ComponentName;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.ServiceConnection;  
  9. import android.os.Bundle;  
  10. import android.os.IBinder;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.Toast;  
  15.   
  16. public class ServiceActivity extends Activity {  
  17.     /** Called when the activity is first created. */  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         Button play = (Button) findViewById(R.id.play);  
  23.         Button stop = (Button) findViewById(R.id.stop);  
  24.         Button bind = (Button) findViewById(R.id.bind);  
  25.         Button unbind = (Button) findViewById(R.id.unbind);  
  26.         final Intent intent = new Intent(ServiceActivity.this,MusicService.class);  
  27.         // 定义intent为final,全局变量,供下面两个匿名内部类(onclicklisenter)使用  
  28.         play.setOnClickListener(new OnClickListener() {  
  29.   
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 // TODO Auto-generated method stub  
  33.                 startService(intent);  
  34.                 // 开始播放,通过前面定义好的intent传递  
  35.   
  36.             }  
  37.         });  
  38.         stop.setOnClickListener(new OnClickListener() {  
  39.   
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 // TODO Auto-generated method stub  
  43.                 stopService(intent);  
  44.                 // 停止播放  
  45.   
  46.             }  
  47.         });  
  48. /*******************************以下为bindService方式启动Service*****************************************/  
  49.         final ServiceConnection conn=new ServiceConnection() {  
  50.         //全局变量final ,供下面两个内部类使用   
  51.             @Override  
  52.             public void onServiceDisconnected(ComponentName name) {  
  53.                 // TODO Auto-generated method stub  
  54.                 Toast.makeText(ServiceActivity.this"绑定成功", Toast.LENGTH_LONG).show();   
  55.                   
  56.             }  
  57.               
  58.             @Override  
  59.             public void onServiceConnected(ComponentName name, IBinder service) {  
  60.                 // TODO Auto-generated method stub  
  61.                 Toast.makeText(ServiceActivity.this"解绑成功", Toast.LENGTH_LONG).show();  
  62.                   
  63.             }  
  64.         };  
  65.         //当采用bindService启动Service,Service和执行bindService所在的Activity绑定成功以后会调用ServiceConnection;  
  66.         //同理,当的Service和使用该Service的客户端取消绑定以后会调用onServiceDisconnected   
  67.         //ServiceConnection(conn)也为下面的bindService和unbindService的参数  
  68.           
  69.         bind.setOnClickListener(new OnClickListener() {  
  70.   
  71.             @Override  
  72.             public void onClick(View v) {  
  73.                 // TODO Auto-generated method stub  
  74.                 bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  75.   
  76.             }  
  77.   
  78.         });  
  79.         unbind.setOnClickListener(new OnClickListener() {  
  80.               
  81.             @Override  
  82.             public void onClick(View v) {  
  83.                 // TODO Auto-generated method stub  
  84.                 unbindService(conn);  
  85.                   
  86.                   
  87.             }  
  88.         });  
  89.     }  
  90. }  

第二个class为service的处理方法,通过复写各种service方法实现不同的功能。


  1. //第二个class  
  2. package conowen.szu.Service;  
  3.   
  4. import android.app.Service;  
  5. import android.content.Intent;  
  6. import android.media.MediaPlayer;  
  7. import android.os.IBinder;  
  8.   
  9. public class MusicService extends Service {  
  10.   
  11.     MediaPlayer player;  
  12.     //新建播放器  
  13.   
  14.     @Override  
  15.     public void onCreate() {  
  16.         // TODO Auto-generated method stub  
  17.         super.onCreate();  
  18.         player = MediaPlayer.create(this, R.raw.lt26);  
  19.         player.setLooping(true);  
  20.         //两种方式的第一个生命周期都是onCreate()  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onStart(Intent intent, int startId) {  
  25.         // TODO Auto-generated method stub  
  26.         super.onStart(intent, startId);  
  27.         player.start();  
  28.   
  29.     }  
  30.   
  31.     @Override  
  32.     public IBinder onBind(Intent intent) {  
  33.         // TODO Auto-generated method stub  
  34.         player.start();  
  35.         return null;  
  36.     }  
  37.   
  38.     @Override  
  39.     public boolean onUnbind(Intent intent) {  
  40.         // TODO Auto-generated method stub  
  41.         player.stop();  
  42.         return super.onUnbind(intent);  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onDestroy() {  
  47.         // TODO Auto-generated method stub  
  48.         super.onDestroy();  
  49.         player.stop();  
  50.     }  
  51.   
  52. }  
效果图:


6、

注:第二个java文件

  1. public class MusicService extends Service {  
继承的是Service,则要在AndroidManifest里面开启Service

  1. <service  
  2.          android:label="player"  
  3.          android:name=".MusicService" >  
  4.         
  5.      service>  
若第一个java文件继承的是Activity,则AndroidManifest里面为

  1. <activity  
  2.          android:label="player"  
  3.          android:name=".MusicService" >  
  4.         
  5.      activity>  


/********************************************************/

对于每多一次点击“播放”按钮时,音乐就多播放一个。(都是同一个音乐,但是播放起步时间不同)

可以把player.start()方法置于onCreate里面,这样就算多次点击“播放”按钮,也没事。因为Service的onCreate的方法只会被调用一次。

如下代码所示(只有“播放”与“停止功能”)并没有加入绑定与解绑

onStart方法不用写出


  1. package conowen.szu.Service;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.media.MediaPlayer;  
  6. import android.os.IBinder;  
  7.   
  8. public class MusicService extends Service {  
  9.     MediaPlayer player;  
  10.   
  11.     @Override  
  12.     public void onCreate() {  
  13.         // TODO Auto-generated method stub  
  14.         super.onCreate();  
  15.         player = MediaPlayer.create(this, R.raw.lt26);  
  16.         player.start();  
  17.     }  
  18.   
  19.     // player.start()在onCreate方法里面时,多次点击play按钮,一样正常播放,也就是说音乐不会再开多一个。  
  20.         //若play.start()放在onStart方面里面,没多一次点击play按钮,就会多播放一次,同样的音乐同时播放(起步不同)  
  21.   
  22.     @Override  
  23.     public IBinder onBind(Intent intent) {  
  24.         // TODO Auto-generated method stub  
  25.         return null;  
  26.     }  
  27.   
  28.   
  29.     @Override  
  30.     public void onDestroy() {  
  31.         // TODO Auto-generated method stub  
  32.         super.onDestroy();  
  33.         player.stop();  
  34.     }  
  35.   
阅读(750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~