搜索

首页  >  问答  >  正文

mediaplayer - android service 静态变量

音乐播放app,在播放service中有一个mediaplayer 静态变量,service启动后,我想从其他activity中取得这个变量,却发现总是null,难道一个service启动过后,他里面的数据都销毁了?

mediaplayer是在service的oncreate中初始化的

其实我是遇到这样的问题:音乐播放app,歌曲列表页面点击一首歌,到播放页面,通过intent传递点击的歌曲信息,同时启动播放service来播放。现在我想在外面的activity加一个正在播放按钮,点击后直接到播放页面,这个时候就没有携带歌曲信息,因此,想着在播放页面的oncreate中做个判断,如果携带了歌曲信息,启动service播放,没有,则只是打开页面,不播放,或继续播放正在播放的歌曲。
我的判断依据就是看service中的mediaplayer是不是null,现在问题就是不管有没有在播放,取到的值都是null

迷茫迷茫2772 天前624

全部回复(2)我来回复

  • 怪我咯

    怪我咯2017-04-17 18:01:26

    在任何时候, 任何组件(指四大组件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上开源项目是怎么实现的

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 18:01:26

    既然是静态变量,那就跟类相关,跟对象无关,即跟Service的生命周期无关。
    我建议你看一下MediaPlayer的初始化过程,是声明时初始化了,还是在Service的生命周期内初始化了。

    补充内容:

    1. 建议贴出代码看一下,重点在于MediaPlayer初始化和又再次被置为null的代码。

    2. 如果MediaPlayer是静态变量,那就只跟类相关,初始化之后又为null,肯定是你代码中哪块逻辑又把它赋值为null了。

    回复
    0
  • 取消回复