音乐播放app,在播放service中有一个mediaplayer 静态变量,service启动后,我想从其他activity中取得这个变量,却发现总是null,难道一个service启动过后,他里面的数据都销毁了?
mediaplayer是在service的oncreate中初始化的
其实我是遇到这样的问题:音乐播放app,歌曲列表页面点击一首歌,到播放页面,通过intent传递点击的歌曲信息,同时启动播放service来播放。现在我想在外面的activity加一个正在播放按钮,点击后直接到播放页面,这个时候就没有携带歌曲信息,因此,想着在播放页面的oncreate中做个判断,如果携带了歌曲信息,启动service播放,没有,则只是打开页面,不播放,或继续播放正在播放的歌曲。
我的判断依据就是看service中的mediaplayer是不是null,现在问题就是不管有没有在播放,取到的值都是null
怪我咯2017-04-17 18:01:26
언제든지 전역 변수를 사용하여 구성 요소(네 가지 주요 구성 요소 참조) 간에 값을 전송하는 것은 권장되지 않습니다. 왜냐하면 IPC 메커니즘에서는 이를 허용하지 않기 때문입니다!
값을 얻을 수 없는 이유는 원격 서비스를 사용하고 있기 때문일 수 있습니다. --- 로컬 서비스와 기본 프로그램이 동일한 프로세스에 있으므로 값을 얻는 데 문제가 없습니다. 했지만 원격 서비스는 프로세스 전반에 걸쳐 수행되며 값을 어떻게 설정하더라도 null이 됩니다.
올바른 접근 방식은 서비스에 바인딩한 다음 ServiceConnection을 가져온 다음 ServiceConnection을 사용하여 작동하거나 원하는 값을 얻는 것입니다.
Android 개발 > API 가이드 > 바인딩 서비스
Android 로컬 서비스와 원격 서비스의 차이점
p.s. 오픈소스 프로젝트가 어떻게 구현되는지는 github에서 참고하실 수 있습니다
天蓬老师2017-04-17 18:01:26
정적 변수이기 때문에 클래스와 관련이 있고 객체와는 아무런 관련이 없습니다. 즉, 서비스의 생명주기와는 아무런 관련이 없습니다.
MediaPlayer의 초기화 프로세스를 살펴보는 것이 좋습니다. 선언할 때 초기화되나요, 아니면 서비스 수명 주기 중에 초기화되나요?
보충내용:
MediaPlayer가 초기화되고 다시 null로 설정된 코드에 초점을 맞춰 코드를 게시하고 살펴보는 것이 좋습니다.
MediaPlayer가 정적 변수인 경우 클래스에만 관련됩니다. 초기화 후 null이면 다시 null에 할당하는 코드의 일부 로직이어야 합니다.