안드로이드에서 화면 간 정보 전달하기

원정빈
SOPT
Published in
4 min readOct 22, 2018

안녕하세요. 저는 안드로이드를 처음 시작할 때 자바를 잘 모르는 상태에서 시작했는데요. 그러다보니 코드를 길게 짜다보면 코드가 산만해지고 관리가 힘들어지는 상황이 자주 발생했습니다. 그 중에서도 여러 액티비티 간 정보를 공유하고 전달할 때 에러사항이 많았습니다.

화면 간에 계속 정보를 전달받거나 업데이트 해야하는 경우

문제상황) 앱을 킨 지 몇 분이나 지났는지 앱의 모든 화면에 표시하고 싶습니다. 쉽게 해결할 방법이 없을까요?

우선, 안드로이드에서 화면 간 정보를 전달하는 방법은 여러가지가 있습니다. Intent를 사용하기도 하고 interface를 통해 정보를 전달해줄 수도 있습니다.

하지만 Intent를 사용한다면 액티비티를 처음 시작할 때밖에 전달해줄 수 없고 interface를 사용한다면 액티비티에서 interface를 상속받아야합니다.

  • Intent를 사용하는 경우, putExtra() 함수를 통해 단순한 정보를 전달할 수 있지만 처음 액티비티를 시작하거나 재호출할 경우밖에 전달할 수 없습니다. 뿐만 아니라, 이 방법을 통해 호출한 액티비티밖에 정보를 전달할 수 없다는 단점이 있습니다.
  • 인터페이스를 사용하는 경우 또한 여간 불편한 것이 아닙니다. 인터페이스를 상속받음으로써 인터페이스를 상속한 클래스간에 정보 전달을 할 수 있게 해줍니다. 저는 구글에 프래그먼트간 정보 전달을 받으려면 어떻게 해야할 지 궁금해서 검색해보았을때 이 방법이 많이 나왔던 것 같습니다.

Singleton 클래스를 만들어보는건 어떨까요?

singleton 패턴은 인스턴스를 하나만 만들 수 있게 하는 탬플릿으로 소프트웨어 디자인 패턴의 한 종류 입니다.

그럼 디자인 패턴은 무엇인가요?

소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학에서 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다. 디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행이다. (출처- 위키백과)

한줄 요약 ) 특정 문맥에서 공통적으로 발생하는 문제에 대한 템플릿

위의 문제상황으로 제시한 상황처럼, 하나만 있어야하면서 앱 전체에서 사용할 클래스의 경우 인스턴스를 더 이상 만들 필요가 없습니다. 오히려 하나로 유지되어야할 필요가 있습니다.

첫 번째 예시는 클래스 자체를 싱글톤으로 만드는 코드이고,

두 번째 예시는 클래스 내부의 객체를 하나의 객체로 유지하는 코드입니다.

그러나 이 방법에도 문제는 있습니다. Android OS는 메모리가 부족한 상황이 오면 사용하지 않는 리소스를 없애버리기 때문입니다.

예시) 카카오톡 앱을 사용하다가 모바일 게임을 하고 돌아왔더니 카카오톡앱이 새로 켜지는 화면이 나옴

그래서 사용하지 않고 있다가 돌아왔을 때 정보를 잃을 수도 있습니다. 또한 멀티스레드 환경에서는 객체가 여러 개 생길 수 있기 때문에 실제로 싱글톤이 아닐 수 있습니다. 또한 Context를 넘겨줬을 경우 제대로 release 해주지 않으면 메모리 누수가 생길 수 있습니다.

결론) 안드로이드에서 싱글톤을 사용하는 것은 지양하는 것이 좋다.

Android.app.Application

안드로이드에서는 Application class가 있는데 앱에서 한 번만 생성이 되고, Activity, Fragment, Service와 같은 클래스들보다 먼저 생성이 됩니다.

그래서 하나의 객체만을 만들거나 앱 전체에서 공유할 데이터를 넣어둘 때 많이 사용합니다.

위의 문제에 대한 해결방법은 싱글톤 클래스를 만드는 대신에 Application ㅊClass에 Single Instance를 만드는 것입니다.

public class MyApplication extends Application {
private static Chicken chicken;

public void onCreate() {
super.onCreate();
chicken = new Chicken();
}

public static Chicken getChicken(){
return chicken;
}
}

이런 식으로 만드셔서 사용하시면 됩니다.

--

--