본문 바로가기

안드로이드/[Kotlin]

[Kotlin] 다른 Activity의 변수, 함수 사용하기

 

 

현재 MainActivity 와 SongActivity 에서 MediaPlayer 를 활용해서 음악을 재생하는 데 까지 성공했다.

 

 

다른 시중(?) 에 있는 음악 어플들은 Service 를 이용해서 백그라운드에서 음악을 재생한다.

하지만 난 그냥 Activity 에서 MediaPlayer 의 변수를 선언해서 음악을 재생했다.

 

처음에는 Main과 Song에서 각각 MediaPlayer 변수를 선언 해 주고 싱크를 최대한 맞춰주려고 했다.

그런데 노래를 재생시킨 채로 Main 과 Song 사이를 서로 이동하면 아무리 싱크를 ms 단위까지 맞추려고 해도 끊기는 현상이 발생했다. 

 

그래서 난 Main에서만 MediaPlayer 변수를 선언하고, 그 변수를 Song 에서 끌어오는 방식을 택했다.

 

키워드는 "다른 Activity 의 변수 사용하기!!!"

 

 

 

//MainActivity.kt

class MainActivity : AppCompatActivity() {

    init { instance = this}
    companion object {
        //자신의 인스턴스를 반환하는 getInstance() 메소드 등록.
        //companion object는 인스턴스를 생성하지 않고, 바로 클래스의 내부에 접근 가능.
        //SongActivity에서 mediaPlayer 변수 끌어다가 쓸 수 있게 하려고 사용!
        private var instance : MainActivity? = null
        fun getInstance():MainActivity? {
            return instance
        }
    }
    
     override fun onCreate(savedInstanceState: Bundle?) {
         ,,,
     }
}

MainActivity 의 전역변수 선언 부분에 위와같은 코드를 입력한다.

 

companion object 를 이용해서 인스턴스 생성 없이 바로 내부의 함수나 변수로 접근이 가능하다.

SongActivity에서 companion object 의 getInstance() 로 접근을 해서 instance, 즉 MainActivity 를 반환받는 것이다.

그로써 SongActivity 에서 MainActivity로 접근이 가능해진다.

 

 

아래 코드는 SongActivity 에서 Main 으로 접근하는 코드이다.

//SongActivity.kt

private val mainActivity = MainActivity.getInstance()
//MainActivity의 mediaPlayer 를 사용하기 위한 코드

,,,
,,,

mainActivity?.mediaPlayer?.seekTo(song.currentTime)
//위 처럼 MainActivity 의 mediaPlayer 참조 가능

 

 

 

 

이 외에도 context 라는 키워드로 구글링을 해 봐도 좋을 거 같다.

 

 

참고 : https://juahnpop.tistory.com/231