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

액티비티 Back 버튼 이동 시 라이프사이클 관련 질문 드립니다.

0 추천
안녕하세요.

현재 어플을 하나 만들어서 테스트 중인데요.

 

켜자마자 Home activity : 버튼 2개로 구성되어 있고 버튼1은 SsidActivity로 넘어가도록, 버튼 2는 MainActivity로 넘어가도록 되어있습니다.

MainActivity는 BLE 스캔 및 연결, 연결 후에 파일 선택 및 파일 전송하도록 되어있구요
SsidActivity는 BLE가 연결된 상태면, 주변에 와이파이 검색 후 선택한 SSID 정보를 입력해서 전송하도록 구성하였습니다.

 

이때, SsidAcitivity 에서 SSID 정보를 전달하려면 MainActivity에서 블루투스 연결을 한 상태여야 하는 것인데.

MainActivity에서 블루투스 연결 후에 Back 버튼으로 이동하여 HomeActivity 로 이동 후 SsidActivity로 이동하면 라이프사이클에서 Destory가 되어 블루투스는 연결된 상태이지만, 내부적으로 관리하는 블루투스 연결에 대한 변수가 초기화되면서 false가 되는 걸로 추정하고있습니다.

 

그래서 SsidActivity에서도 원하는 동작이 안되고

다시 MainActivity로 가도 블루투스 연결이 끊기진 않았지만 상태에는 블루투스가 연결되지 않은 걸로 나오는 등의 오류가 발생하고 있습니다...
이럴 땐 어떤식으로 처리해야할 지 조언을 구하고 싶습니다.

원하는 동작은 블루투스 연결 후에 해당 상태를 계속 갖고 있는 것인데요.

isBleConnection라는 연결 상태에 대한 변수만 따로 MainActivity 말고 다른데서 관리하면 될까요..?

 

안드로이드를 원래 개발하던 것이 아니라 인수인계받아서 여기저기서 필요한 내용 갖다 붙이고 있어서.. 어렵네요
육도 (370 포인트) 님이 2021년 2월 25일 질문

1개의 답변

+1 추천
 
채택된 답변

두개의 액티비티에서 쉐어할 수 있는 클래스의 인스턴스를 만들어서 사용하세요.  간단하게는 Application을 상속받아 하위클래스를 만드신 다음, 여기에서 애플리케이션 스콥의 객체를 하나 생성하시면 됩니다.

아니면 싱글톤 패턴을 사용하셔서 싱글톤 객체를 만드신 다음 이걸 공유하셔도 되구요.  아래에 Publisher - Subscriber 패턴을  이용한 순수 자바 솔루션을 참고하세요.

public class BLEEvent {
    private final boolean connected;

    BLEEvent(boolean connected) {
        this.connected = connected;
    }

    public boolean isConnected() {
        return connected;
    }
}

interface BLESubscriber {
   void onChanged(BLEEvent event);
}

public class BLEEventBus {
    private BLEEvent lastEvent;
    private final Set<BLESubscriber> subscribers = new HashSet<>();

    private BLEEventBus() {
    }

    public void subscribe(BLESubscriber subscriber) {
        subscribers.add(subscriber);
        // 새로운 Subscriber 등록시 자동으로 마지막 이벤트를 내보냄.
        if (lastEvent != null) {
            subscriber.onChanged(lastEvent);
        }
    }

    public void unsubscribe(BLESubscriber subscriber) {
        subscribers.remove(subscriber);
    }

    public void publish(BLEEvent event) {
        this.lastEvent = event;
        for (BLESubscriber subscriber : subscribers) {
            subscriber.onChanged(event);
        }
    }

    public static BLEEventBus getInstance() {
        return Impl.INSTANCE;
    }


    // static inner class를 이용한 싱글톤 객체 만들기
    private static class Impl {
        static BLEEventBus INSTANCE = new BLEEventBus();
    }
}

public class BLEEventBusPublisher {
    private final BLEEventBus eventBus;
    public BLEEventBusPublisher(BLEEventBus eventBus) {
        this.eventBus = eventBus;
    }

    public void publish(BLEEvent event) {
        eventBus.publish(event);
    }
}

public class BLEEventBusSubscriber {
    private final BLEEventBus eventBus;
    public BLEEventBusSubscriber(BLEEventBus eventBus) {
        this.eventBus = eventBus;
    }

    public void subscribe(BLESubscriber subscriber) {
        eventBus.subscribe(subscriber);
    }

    public void unsubscribe(BLESubscriber subscriber) {
        eventBus.unsubscribe(subscriber);
    }
}



//MainActivity
final BLEEventBusPublisher eventPublisher = new BLEEventBusPublisher(BLEEventBus.getInstance());


// 블루투스 연결시
eventPublisher.publish(new BLEEvent(true));


//SsidActivity
final BLEEventBusSubscriber eventSubscriber = new BLEEventBusSubscriber(BLEEventBus.getInstance());


@Override
public void onChanged(BLEEvent event) {
   //여기에 필요한 처리
}

// onStart라이프사이클 이벤트에 Subscribe를 등록
@Override
public void onStart() {
   super.onStart();
   eventSubscriber.subscribe(this);
}

// onStop라이프사이클 이벤트에 Subscribe를 해제
@Override
public void onStop() {
   super.onStop();
   eventSubscriber.unsubscribe(this);
}

 

spark (224,800 포인트) 님이 2021년 2월 25일 답변
육도님이 2021년 2월 26일 채택됨
상세한 설명 정말 감사드립니다!!
어제 답변 보기 전에는 홈 액티비티에서 블루투스 연결 상태에 대한 변수 추가해서 인스턴스 정보를 전달하는 방식으로 테스트하다가 제대로 안되어서 마무리지었었는데

오늘은 가르쳐주신 내용 참고해서 해봐야겠습니다.
감사합니다!

오늘 하루도 좋은 하루 되세요!
...