上一篇:Android音乐播放器边播边缓存(一)AndroidVideoCache的使用方法

第二篇记录一下,后台播放音乐的方式,没看过上一篇的朋友圈可以先移步 ↑ 链接。

下一篇:【Android】音乐播放器边播边缓存(三)AndroidVideoCache的先下载再播放


【Service】

后台播放,那我们很容易的想到就是在Service里面进行。主要介绍一下实现思路。


1.Activity与Service间的通信

启动服务有两种方法,startService和bindService

使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行;

使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

更具体的区别,大家可以自行搜索,这里不再赘述。


在我们这里面的需求,需要保证用户退出这个界面(activity),service不能停,因此我们需要使用startService方法

此外,我们还需要获得从Service到Activity的通信方式(如再次进入activity时,要从service获取当前正在播放的歌曲名字等)

因此我们还需要bindService方法获取service中的参数等。


2.bindService的使用

我们通过重写Service中的onBind方法 及自定义IBinder

    @Nullable    @Override    public IBinder onBind(Intent intent) {        return binder;    }
public class MusicPlayBinder extends Binder {        public ExoPlayer getPlayer() {            return mPlayer;        }        public int getMusicType() {            return musicType;        }        public int getMusicPlayingType() {            return isPlayingMusicType;        }        public String getMusicName() {            return musicName;        }        public String getMusicImageUrl() {            return imageUrl;        }        //... ... 其他方法    }

在Activity中,获取通信

bindService(intent, connection, BIND_AUTO_CREATE);
private ServiceConnection connection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            musicPlayBinder = (MusicPlayService.MusicPlayBinder) iBinder;//获取到了service中的IBinder            if (musicPlayBinder.getPlayer() == null || targetUrl == null) {                Log.d(TAG, "player暂未初始化" + targetUrl);            } else {                Log.d(TAG, "player已经初始化" + targetUrl);            }        }        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    };

3.开启前台服务

            Notification.Builder builder = new Notification.Builder(context);            Intent targetIntent = new Intent(context, MusicPlayActivity.class);            Bundle targetBundle = new Bundle();            targetBundle.putInt("musicType", isPlayingMusicType);            targetIntent.putExtra("bundle", targetBundle);            PendingIntent contentIntent = PendingIntent.getActivity(context, 0,//点击前台通知时的intent                    targetIntent, PendingIntent.FLAG_UPDATE_CURRENT);            builder.setContentIntent(contentIntent);            builder.setSmallIcon(R.mipmap.logo_launcher);            Notification notification = builder.build();            RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_music_fore);//自定义前台通知的样式            remoteViews.setTextViewText(R.id.notify_name, musicName);            remoteViews.setTextViewText(R.id.notify_desc, musicDesc);            if (isPlayingMusicType == Constant.MUSIC_TYPE_RELAX) {                remoteViews.setTextViewText(R.id.notify_type, getResources().getString(R.string.home_relax));            } else if (isPlayingMusicType == Constant.MUSIC_TYPE_SLEEP) {                remoteViews.setTextViewText(R.id.notify_type, getResources().getString(R.string.home_sleep));            }            notification.contentView = remoteViews;            startForeground(1, notification);//启动前台通知

样式如下



点击这个通知就可以再次进入Activity了,然后通过connection获取Service中正在播放的音乐信息,渲染到Activity上。



更多相关文章

  1. Android(安卓)GPRS的自动打开与关闭。
  2. Android(安卓)开发艺术探索笔记之八 -- 理解 Window 和 WindowMa
  3. Android(安卓)中Dialog点击空白处會消失问题
  4. ANDROID 后台服务 service
  5. Android(安卓)Studio中获取sha1证书指纹数据的方法
  6. Android中Alarm的机制
  7. 获取调试版SHA1和发布版SHA1的方法
  8. android默认焦点设置的方法
  9. android动态加载Jar/dex--原创

随机推荐

  1. Android推荐学习路线图
  2. android中Intent传值与Bundle传值详解
  3. Android(安卓)input输入设备键值从底层到
  4. 怎样用 C/C++ 开发一个原生程序运行在 An
  5. 【Flutter】认识目录结构
  6. 将Android工程做成jar包和资源文件
  7. Android(安卓)资源,国际化,自适应
  8. 一个小白的Android之路
  9. Android中配置和使用Google Map服务
  10. Android(安卓)开机速度优化-----ART 预先