mediaplayer - android service 静态变量

【字号: 日期:2022-11-14浏览:17作者:雯心

问题描述

音乐播放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了。

相关文章: