Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)

来源:互联网 发布:淘宝网pu羽绒服 编辑:程序博客网 时间:2024/05/16 11:55

1.回顾

   上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识

2.重点

  (1)Service 分类

  (2)Service 的生命周期

  (3)Service 标签 下的属性

  (4)什么时候使用BindService 和 startService ?

  (5)实例 - 通过Service 服务 实现 音乐播放器 后台播放

3.Service 分类

   3.1 按照地点分

   (1)本地服务 

       服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。

     缺点:主进程被Kill后,服务便会终止。

   (2)远程服务 (一般为系统服务)

      服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。

    缺点:该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。


  3.2 按 运行分类

    (1)前台服务

           会在通知一栏显示 ONGOING 的 Notification,当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。

    (2)后台服务

           默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

 

  3.3 按 使用 分类

    (1)startService 启动的服务

          主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService!

   (2)bindService 启动的服务

          该方法启动的服务要进行通信。停止服务使用unbindService ;

    (3)startService 同时也 bindService 启动的服务

         停止服务应同时使用stepService与unbindService

4.Service 生命周期

    4.1 Start方式

      startService() : onCreate()   ->  onStart()   ->  onDestroy() 


 

     如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来仍然可以    stopService。   


    4.2 bind方式

      onBindService(): onCreate()  -> onBind()  -> onUnbind()  -> onDestroy()



      调用者退出了,Srevice就会调用onUnbind-->onDestroyed 所谓绑定在一起就共存亡了。 


5. Service 标签下的属性

(1)android:name : 服务类名

(2)android:label : 服务的名字,如果此项不设置,那么默认显示的服务名则为类名

(3)android:icon  :服务的图标

(4)android:permission  : 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务

(5)android:process  :表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字

(6)android:enabled  : 如果此项设置为 true,那么 Service 将会默认被系统启动,不设置默认此项为 false

(7)android:exported : 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false

6. 什么时候使用BindService 和 startService ?

   (1启动一个后台服务长期进行某项任务那么使用 startService

   (2)想要与正在运行的 Service 取得联系,使用 bindService

   (3)等等

7.Service实例—— 音乐播放器后台运行

  7.1 需求

     (1)startService() 实现 

     (2)onbindService() 实现

     (3)一些优化:显示当前播放状态,存储播放状态配置(SharedPreference实现)

  7.2 效果图

       startService() 效果图:                                                       onbindService() 效果图:

                                


    7.3 MusicService 实现

[java] view plain copy
  1. package com.example.service;  
  2.   
  3.   
  4. import com.example.servicedemo.R;  
  5.   
  6. import android.app.Service;  
  7. import android.content.Intent;  
  8. import android.media.MediaPlayer;  
  9. import android.os.Binder;  
  10. import android.os.IBinder;  
  11. import android.provider.MediaStore.Audio.Media;  
  12. import android.util.Log;  
  13.   
  14. public class MusicService extends Service {  
  15.   
  16.       
  17.     private String TAG="MusicService";  
  18.       
  19.     private MediaPlayer player;  
  20.       
  21.     @Override  
  22.     public void onCreate() {  
  23.         // 服务创建:可以做初始化 操作  
  24.           
  25.         Log.i(TAG, "onCreate");  
  26.           
  27.         //初始化 音乐播放  
  28.         player=MediaPlayer.create(getApplicationContext(),R.raw.m123);  
  29.         //设置 无限循环  
  30.         player.setLooping(true);  
  31.           
  32.           
  33.         super.onCreate();  
  34.     }  
  35.       
  36.       
  37.     @Override  
  38.     public void onStart(Intent intent, int startId) {  
  39.         // 开启服务  
  40.         Log.i(TAG, "onStart");  
  41.           
  42.         //播放  
  43.         player.start();  
  44.         super.onStart(intent, startId);  
  45.     }  
  46.       
  47.       
  48.       
  49.       
  50.     @Override  
  51.     public IBinder onBind(Intent intent) {  
  52.         //开启服务  
  53.         //其他对象通过bindService 方法通知该Service时该方法被调用  
  54.         Log.i(TAG, "onBind");  
  55.           
  56.         //返回 对象  
  57.         return new mBind();  
  58.     }  
  59.       
  60.     @Override  
  61.     public void onDestroy() {  
  62.         //销毁时  
  63.         Log.i(TAG, "onDestroy");  
  64.         //停止  
  65.         player.stop();  
  66.         super.onDestroy();  
  67.     }  
  68.       
  69.     @Override  
  70.     public boolean onUnbind(Intent intent) {  
  71.         //其它对象通过unbindService方法通知该Service时该方法被调用  
  72.         //解绑定操作  
  73.           
  74.         Log.i(TAG, "onUnbind");  
  75.         //停止  
  76.         return super.onUnbind(intent);  
  77.     }  
  78.   
  79.       
  80.     //用来返回 musicservice 对象   
  81.     //start() 是没办法 返回 服务对象的  
  82.     //binder 可以返回 bind对象  
  83.       
  84.     public class mBind extends Binder{  
  85.           
  86.         public MusicService getService(){  
  87.             return MusicService.this;  
  88.         }  
  89.     }  
  90.       
  91.     //binder 播放音乐  
  92.     public void playMusic(){  
  93.         player.start();  
  94.     }  
  95.       
  96.       
  97.     //binder 停止音乐  
  98.     public void stopMusic(){  
  99.         player.stop();  
  100.     }  
  101.       
  102.     //当然 还可以添加 其余操作  
  103. }  

  7.4 AndroidMianfest.xml 配置

[html] view plain copy
  1. <service   
  2.           android:name="com.example.service.MusicService"  
  3.           ></service>  

   7.5 业务实现

[java] view plain copy
  1. package com.example.servicedemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Service;  
  5. import android.content.ComponentName;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.content.SharedPreferences;  
  9. import android.content.SharedPreferences.Editor;  
  10. import android.graphics.Color;  
  11. import android.os.Bundle;  
  12. import android.os.IBinder;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18. import com.example.service.MusicService;  
  19. import com.example.service.MusicService.mBind;  
  20.   
  21. public class MainActivity extends Activity implements OnClickListener {  
  22.   
  23.     // 音乐播放服务  
  24.     private MusicService musicService;  
  25.   
  26.     /** 
  27.      * 通过SerciceConnection 对象 的相关 方法可以得到 更多的Service对象 
  28.      */  
  29.     private ServiceConnection conn = new ServiceConnection() {  
  30.   
  31.         @Override  
  32.         public void onServiceDisconnected(ComponentName name) {  
  33.             // 当启动源跟 Service 的 连接 以外的丢失的时候,会调用这个方法:比如Service被杀死了  
  34.   
  35.         }  
  36.   
  37.         @Override  
  38.         public void onServiceConnected(ComponentName name, IBinder service) {  
  39.             // 当启动源跟 Service 成功 连接之后会 自动调用这个方法  
  40.             musicService = ((mBind) service).getService();  
  41.         }  
  42.   
  43.     };  
  44.   
  45.     private TextView textview1;  
  46.     private Button button1, button2, button3, button4, button5, button6;  
  47.   
  48.     private SharedPreferences shared;  
  49.     private final String PLAYMUSIC = "音乐状态:音乐播放中。。。。。。。。";  
  50.     private final String STOPMUSIC = "音乐状态:播放停止";  
  51.   
  52.     @Override  
  53.     protected void onCreate(Bundle savedInstanceState) {  
  54.         super.onCreate(savedInstanceState);  
  55.         setContentView(R.layout.activity_main);  
  56.   
  57.         // 使用SharedPreferences 保存 音乐的状态  
  58.         shared = this.getSharedPreferences("music"10);  
  59.   
  60.         // 显示 当前 音乐状态  
  61.         textview1 = (TextView) findViewById(R.id.textView1);  
  62.         button1 = (Button) findViewById(R.id.button1);  
  63.         button2 = (Button) findViewById(R.id.button2);  
  64.         button3 = (Button) findViewById(R.id.button3);  
  65.         button4 = (Button) findViewById(R.id.button4);  
  66.         button5 = (Button) findViewById(R.id.button5);  
  67.         button6 = (Button) findViewById(R.id.button6);  
  68.         button1.setOnClickListener(this);  
  69.         button2.setOnClickListener(this);  
  70.         button3.setOnClickListener(this);  
  71.         button4.setOnClickListener(this);  
  72.         button5.setOnClickListener(this);  
  73.         button6.setOnClickListener(this);  
  74.   
  75.         // 加载状态 文件 配置  
  76.         String mState = shared.getString("mState"null);  
  77.         int mColor = shared.getInt("mColor"0);  
  78.         if (mState != null) {  
  79.             if (mColor > 0) {  
  80.                 textview1.setTextColor(Color.RED);  
  81.             } else {  
  82.                 textview1.setTextColor(Color.BLUE);  
  83.             }  
  84.             textview1.setText(mState);  
  85.         }  
  86.   
  87.     }  
  88.   
  89.     /** 
  90.      * 按钮点击事件 
  91.      */  
  92.     @Override  
  93.     public void onClick(View v) {  
  94.         // 根据id 点击  
  95.         // 根据Intent 来开启 Service  
  96.         Intent intent = new Intent(MainActivity.this, MusicService.class);  
  97.         switch (v.getId()) {  
  98.         case R.id.button1:  
  99.             // onStart 方式 开启 音乐服务:播放音乐  
  100.             startService(intent);  
  101.   
  102.             // 音乐状态  
  103.             playMusicState();  
  104.             break;  
  105.         case R.id.button2:  
  106.             // onStart 方式 关闭 音乐服务:关闭音乐播放  
  107.             stopService(intent);  
  108.   
  109.             // 音乐状态  
  110.             stopMusicState();  
  111.             break;  
  112.         case R.id.button3:  
  113.             // onBind 方式 开启 音乐服务:播放音乐  
  114.             bindService(intent, conn, Service.BIND_AUTO_CREATE);  
  115.   
  116.             textview1.setText("onBind() 成功");  
  117.             break;  
  118.         case R.id.button4:  
  119.             // onBind 方式 关闭 音乐服务:关闭音乐播放  
  120.              unbindService(conn);  
  121.              textview1.setText("unBind() 成功");  
  122.             break;  
  123.   
  124.         case R.id.button5:  
  125.               
  126.             //播放音乐  
  127.             musicService.playMusic();  
  128.               
  129.             // 音乐状态  
  130.             playMusicState();  
  131.             break;  
  132.         case R.id.button6:  
  133.               
  134.             //停止  
  135.             musicService.stopMusic();  
  136.   
  137.             // 音乐状态  
  138.             stopMusicState();  
  139.             break;  
  140.         }  
  141.   
  142.     }  
  143.   
  144.     /** 
  145.      * 存入本地,状态配置 
  146.      *  
  147.      * @param content 
  148.      * @param color 
  149.      */  
  150.     private void EditMusicState(String content, int color) {  
  151.         Editor editor = shared.edit();  
  152.         // 状态  
  153.         editor.putString("mState", content);  
  154.         // 文字颜色 0 蓝色 ; 1 红色;  
  155.         editor.putInt("mColor", color);  
  156.         // 提交  
  157.         editor.commit();  
  158.     }  
  159.   
  160.     /** 
  161.      * 音乐播放状态 
  162.      */  
  163.     private void playMusicState() {  
  164.         textview1.setTextColor(Color.BLUE);  
  165.         textview1.setText(PLAYMUSIC);  
  166.         EditMusicState(PLAYMUSIC, 0);  
  167.     }  
  168.   
  169.     /** 
  170.      * 音乐停止状态 
  171.      */  
  172.     private void stopMusicState() {  
  173.         textview1.setTextColor(Color.RED);  
  174.         textview1.setText(STOPMUSIC);  
  175.         EditMusicState(STOPMUSIC, 1);  
  176.     }  
  177.   
  178. }  


8.demo 下载

  http://download.csdn.net/detail/lablenet/9059911


  不知不觉已经很晚了,也该睡觉了,Service晚安!睡觉

0 0