마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액티비티끼리 양방향으로 텍스트를 주고 받게 하고 싶습니다 [closed]

0 추천
1,2,3번 액티비티가 있다고 가정하면,

1>2>3번으로 데이터를 보내고 받고뿐 아니라

1>2>3>1>2>3 (정방향)

3>2>1>3>2>1 (역방향)

이렇게 계속 돌아도 1번액티비티에서 로그인한 아이디가 계속해서 이동되는 액티비티 상단의 텍스트뷰에 뜨게 하고싶습니다.

하나의 액티비티에 putExtra와 getStringExtra 2개씩 onCreate에도 넣어보고 onBackPressed에도 넣어봤는데 화면전환하다가 어느부분부터 값이 전달이 안돼서 null로 나옵니다.

조언 좀 주세요
질문을 종료한 이유: 문제해결
드림트리 (170 포인트) 님이 2022년 2월 22일 질문
드림트리님이 2022년 2월 23일 closed

1개의 답변

0 추천

말씀하시는 내용은 양방향 통신과는 관련이 없고 사용자 세션 관리의 일부라고 해야 할 것 같네요. 로그인한 사용자 아이디를 가능하면 persistence 한 저장공간(File, DB, Server 등등 물리적인 공간)에 저장하는게 좋지만, 이게 허용되지 않는다면 메모리에 저장해야 합니다. 첫번째 옵션이 가능하다면 SharedPreferences를 사용해서 로그인 후에 사용자 ID를 암호화해서 저장하시면 되고, 메모리를 이용하신다면 메모리를 핸들링할 수 있는 클래스를 하나 만드시면 됩니다. 어느 경우이든 인터페이스를 먼저 선언하고 이걸 구현하시길 권장합니다. 여기에는 유연성, 확장성, 테스트 용이성, 구현디테일 감추기 등등 많은 엔지니어링의 이유가 있습니다.

아래는 간단한 예제입니다. (코틀린으로 작성합니다.)
 

먼저, 아래와 같이 로그인한 사용자 ID 를 저장할 인터페이스와 클래스를 하나씩 만드세요.

interface SessionStore {
    fun getLoggedInUserId(): String?
    fun setLoggedInUserId(value: String?)
}

// Singleton
object MemorySessionStore : SessionStore {

    private var loggedInUserId: String? = null

    override fun getLoggedInUserId(): String? {
        return loggedInUserId
    }

    override fun setLoggedInUserId(value: String?) {
        loggedInUserId = value
    }
}

 

구현클래스인 MemorySessionStore는 object 키워드를 사용해서 앱 어디서나 접근할 수 있도록 Singleton으로 만들었습니다.

 

이제 로그인을 하는 곳에서 로그인 후에 사용자 정보를 MemorySessionStore에 저장합니다.

private val sessionStore: SessionStore = MemorySessionStore

fun login() {
   // 기존 로그인하는 코드
    
   // 로그인 성공 직후
   sessionStore.setLoggedInUserId(userId)
}

 

이제 앱 어느 곳에서든 sessionStore를 선언하고 getLoggedInUserId()를 통해 로그인한 사용자 ID를 불러오면 됩니다.

class FirstActivity : AppCompatActivity() {

      private val sessionStore: SessionStore = MemorySessionStore

      override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(...)

         textView.text = sessionStore.getLoggedInUserId() ?: ""
      }
}


class SecondActivity : AppCompatActivity() {

      private val sessionStore: SessionStore = MemorySessionStore

      override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(...)

         textView.text = sessionStore.getLoggedInUserId() ?: ""
      }
}

 

아주 간단하게 예를 든 것이기 때문에, 공유할 수 있는 클래스에 데이터를 저장하고 접근해서 사용하다는 점을 눈여겨 보시면 될 것 같습니다.

그리고 앱 전체에 걸쳐 사용자 ID를 보여주는 부분이 반복된다면 이 부분도 공통적인 로직으로 빼내서 만드시면 더 좋을 것 같습니다.

 

spark (227,470 포인트) 님이 2022년 2월 22일 답변
spark님이 2022년 2월 22일 수정
답변 감사합니다. 그런데 미리 말씀 드리지 않았는데 저는 자바만 배웠고 초보라 내용 이해가 힘드네요ㅜㅜ SharedPreferences는 사용해봤는데 앱을 끄고 다시켜도 내용이 남는 것 같아서 코드를 지웠었는데...정 방법이 없으면 그냥 써야겠네요
...