Services实现的后台音乐播放器

Android允许我们使用Service组件来完成后台任务,这些任务的允许不会影响到用户其他的交互。
  1. 被startService的
    无论是否有任何活动绑定到该Service,都在后台运行。onCreate(若需要) -> onStart(int id, Bundle args). 多次startService,则onStart调用多次,但不会创建多个Service实例,只需要一次stop。该Service一直后台运行,直到stopService或者自己的stopSelf()或者资源不足由平台结束。

  2. 被bindService的
    调用bindService绑定,连接建立服务一直运行。未被startService只是BindService,则onCreate()执行,onStart(int,Bundle)不被调用;这种情况下绑定被解除,平台就可以清除该Service(连接销毁后,会导致解除,解除后就会销毁)。

  3. 被启动又被绑定
    类似startService的生命周期,onCreate onStart都会调用。

  4. 停止服务时
    stopService时显式onDestroy()。或不再有绑定(没有启动时)时隐式调用。有bind情况下stopService()不起作用。
    实验:
    布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Switch
        android:id="@+id/st_music"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textOn="@string/play"
        android:textOff="@string/stop"
        android:layout_marginTop="184dp"
        android:text="@string/music_bg" />

</RelativeLayout>

Activity类:

    package demo.camera;  
    import android.app.Activity;  
    import android.content.ComponentName;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.content.ServiceConnection;  
    import android.os.Bundle;  
    import android.os.IBinder;  
    import android.view.View;  
    /** 
     * 演示Activity如何利用Service来完成后台Audio的播放功能 
     * 同时如何将Service和Activity进行绑定 
     * @author Administrator 
     * 
     */  
    public class BackgroundAudioDemo extends Activity {  

        private AudioService audioService;  

        //使用ServiceConnection来监听Service状态的变化  
        private ServiceConnection conn = new ServiceConnection() {  

            @Override  
            public void onServiceDisconnected(ComponentName name) {  
                // TODO Auto-generated method stub  
                audioService = null;  
            }  

            @Override  
            public void onServiceConnected(ComponentName name, IBinder binder) {  
                //这里我们实例化audioService,通过binder来实现  
                audioService = ((AudioService.AudioBinder)binder).getService();  

            }  
        };  

        public void onCreate(Bundle savedInstanceState){  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.back_audio);  
        }  


        public void onClick(View v){  
            int id = v.getId();  
            Intent intent = new Intent();  
            intent.setClass(this, AudioService.class);        
            if(id == R.id.btn_start){  
                //启动Service,然后绑定该Service,这样我们可以在同时销毁该Activity,看看歌曲是否还在播放  
                startService(intent);  
                bindService(intent, conn, Context.BIND_AUTO_CREATE);  
                finish();  
            }else if(id == R.id.btn_end){  
                //结束Service  
                unbindService(conn);  
                stopService(intent);  
                finish();  
            }else if(id == R.id.btn_fun){  
                audioService.haveFun();  
            }  
        }  
    }  

Service类:

    package demo.camera;  
    import android.app.Service;  
    import android.content.Intent;  
    import android.media.MediaPlayer;  
    import android.os.Binder;  
    import android.os.IBinder;  
    import android.widget.MediaController.MediaPlayerControl;  
    /** 
     * 为了可以使得在后台播放音乐,我们需要Service 
     * Service就是用来在后台完成一些不需要和用户交互的动作 
     * @author Administrator 
     * 
     */  
    public class AudioService extends Service implements MediaPlayer.OnCompletionListener{  

        MediaPlayer player;  

        private final IBinder binder = new AudioBinder();  
        @Override  
        public IBinder onBind(Intent arg0) {  
            // TODO Auto-generated method stub  
            return binder;  
        }  
        /** 
         * 当Audio播放完的时候触发该动作 
         */  
        @Override  
        public void onCompletion(MediaPlayer player) {  
            // TODO Auto-generated method stub  
            stopSelf();//结束了,则结束Service  
        }  

        //在这里我们需要实例化MediaPlayer对象  
        public void onCreate(){  
            super.onCreate();  
            //我们从raw文件夹中获取一个应用自带的mp3文件  
            player = MediaPlayer.create(this, R.raw.tt);  
            player.setOnCompletionListener(this);  
        }  

        /** 
         * 该方法在SDK2.0才开始有的,替代原来的onStart方法 
         */  
        public int onStartCommand(Intent intent, int flags, int startId){  
            if(!player.isPlaying()){  
                player.start();  
            }  
            return START_STICKY;  
        }  

        public void onDestroy(){  
            //super.onDestroy();  
            if(player.isPlaying()){  
                player.stop();  
            }  
            player.release();  
        }  

        //为了和Activity交互,我们需要定义一个Binder对象  
        class AudioBinder extends Binder{  

            //返回Service对象  
            AudioService getService(){  
                return AudioService.this;  
            }  
        }  

        //后退播放进度  
        public void haveFun(){  
            if(player.isPlaying() && player.getCurrentPosition()>2500){  
                player.seekTo(player.getCurrentPosition()-2500);  
            }  
        }  
    }  

3、在清单文件AndroidManifest.xml中配置Service

    <service
            android:name=".AudioService" />
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值