1.服务
主类:IntentService
主函数:
onCreate() :
HandlerThread thread.start(); 处理任务的子线程
mServiceHandler = new ServiceHandler( thread.gerLooper ); 附着在子线程上 负责处理任务逻辑的一个handler
内部类:ServiceHandler
内部函数:
ServiceHandler(Looper): 构造函数,根据Looper创建handler
handlerMessage(msg):
onHandlerIntent(msg.obj): 虚函数,在主类里面实现它,处理Intent的任务(重要)
stopSelf(msg.arg1)
主类主函数:
然后再onStart()里面 对intent进行获取与初步处理
onStart(Intent intent, int startId) :
msg.obj = intent;
msg.arg1 = startId;
sendMessage(Msg);
主类主函数:onHandlerIntent
(以上是 android.app.IntentService源码)
注意:1. Service不是独立的线程或者进程,它依赖于主线程,不要写耗时操作在里面
2.这里讲的Service是本地服务,远程服务则运行在飞主线程内.
3.Service与activity通信 有两种: 一种IBinder 一种broadcast广播(可能不严谨)
参考这里: https://segmentfault.com/a/1190000002400391
2.广播
这里用广播进行通信
广播很简单,我在service里面注册广播1,activity里面 触发暂停,开始按钮时候就发送广播 sendBroadcast(intent) 出去.注意这里的intent提前在广播1注册时候祖册进去.
还有就是activity里面需要实时更新seekbar,这时候就需要双广播,也就是在activity注册广播2.需要实时的将MediaPlayer的进度发送给activity.这时候就考虑了摒弃广播来写播放器.
思路2.
MediaPlayer 一个子线程
seekbar.lyricView一个线程
两个线程的handler都在main 线程里面创建,自然的就没有了 通信的烦恼.
以上只做工作笔记.
Android 实现音乐播放器
1. MediaPlayer和seekbar 同步
2. 歌词和seekbar同步
3. 暂停时候:拖动seekbar,歌词同步滑动