问题描述
音乐播放app,在播放service中有一个mediaplayer 静态变量,service启动后,我想从其他activity中取得这个变量,却发现总是null,难道一个service启动过后,他里面的数据都销毁了?
mediaplayer是在service的oncreate中初始化的
其实我是遇到这样的问题:音乐播放app,歌曲列表页面点击一首歌,到播放页面,通过intent传递点击的歌曲信息,同时启动播放service来播放。现在我想在外面的activity加一个正在播放按钮,点击后直接到播放页面,这个时候就没有携带歌曲信息,因此,想着在播放页面的oncreate中做个判断,如果携带了歌曲信息,启动service播放,没有,则只是打开页面,不播放,或继续播放正在播放的歌曲。我的判断依据就是看service中的mediaplayer是不是null,现在问题就是不管有没有在播放,取到的值都是null
问题解答
回答1:在任何时候, 任何组件(指四大组件Component)间, 不建议使用全局变量来传值, 因为: IPC 机制不允许你这么做!
我猜想你为什么取不到值, 或许跟你使用了Remote Service有关, --- Local Service和主程序在一个进程的, 像你那么取值是没有问题的, 但是Remote Service就跨进程了, 不管你怎么取值都会是null.
正确的做法是: bind 到 Service 上, 然后获取到 ServiceConnection , 通过 ServiceConnection 来操作或者获取想要得到的值.
请参考: Android Develop > API Guides > 绑定服务Android Local Service & Remote Service 的区别
p.s. 可以参考下github上开源项目是怎么实现的
回答2:既然是静态变量,那就跟类相关,跟对象无关,即跟Service的生命周期无关。我建议你看一下MediaPlayer的初始化过程,是声明时初始化了,还是在Service的生命周期内初始化了。
补充内容:
建议贴出代码看一下,重点在于MediaPlayer初始化和又再次被置为null的代码。
如果MediaPlayer是静态变量,那就只跟类相关,初始化之后又为null,肯定是你代码中哪块逻辑又把它赋值为null了。