Service的实现

既然是音乐播放器就自然免不了MediaPlayer了,MediaPlayer原生的方法就有好几个常用的:

MediaPlayer.reset();重置播放器数据
MediaPlayer.setDataSource();设置播放的源文件
MediaPlayer.prepare();正式加载源文件
MediaPlayer.start();
MediaPlayer.pause();
MediaPlayer.seekTo();
MediaPlayer.getCurrentPosition();
MediaPlayer.getDuration();
MediaPlayer.release();
MediaPlayer.setOnCompletionListener();

用上面的方法足以实现播放器的大部分功能了,但是有2个问题。
1. MediaPlayer实例一个APP应该只能有一个,否则一点播放列表中的歌曲就生成一个MediaPlayer放歌,那不岂变成多首歌同时播放了么。所有我们需要一个APP全局实例,做到这一点就要用到Application组件,位于Activity高一层的组件,把Manifest.xml中的Application标签换成我们自己写的Application类。
2. 放歌的时候我们退出APP并不能真正的退出,MediaPlayer应该还要在后台播放,所以MediaPlayer肯定是与Service一起使用的。
3. 在长时间把APP放在后台,一段时间之后,又或者当系统内存紧张的时候会杀死这些后台程序的,所以为了避免Service被杀死,要把Service设为前台服务,提升优先级。


创建Service
  1. 编写AIDL : IMediaService.aidl
  2. 自动生成IMediaService.java
  3. 编写Service类,在OnBind函数返回继承了IMediaService.Stub类的真正服务端
private ServiceConnection connection=new ServiceConnection()
    {

        @Override
        public void onServiceDisconnected(ComponentName arg0)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1)
        {
            // TODO Auto-generated method stub
            server=IMediaService.Stub.asInterface(arg1);
        }
    };

把Service设置成前台服务:用的就是Service.startForeground(id,notification);和Service.stopForeground(boolean);

public void updateNotification(String musicname,String artist)
    {
        Notification notification=new Notification();
        //设置Notification的status的内容
        notification.icon=R.drawable.ic_launcher;
        notification.tickerText=musicname;
        //设置Notification的下拉下来展示的内容
        RemoteViews rv=new RemoteViews(getPackageName(), R.layout.notification);
        rv.setTextViewText(R.id.notification_musicname_tv, "正在播放: "+musicname);
        rv.setTextViewText(R.id.notification_artist_tv, artist);
        notification.contentView=rv;
        //设置按Notification时的跳转
        Intent intent=new Intent(getApplicationContext(), MainActivity.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
        notification.contentIntent=pendingIntent;

        startForeground(1, notification);
    }
    public void cancelNotification()
    {
        stopForeground(true);
    }

Parcelable的实现:
http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值