본문 바로가기
안드로이드

안드로이드 foreground delay

by 코딩히어로 2022. 5. 12.
728x90

블루투스 서비스를 개발하면서 어플이 꺼졌을 때에도 블루투스가 동작함에 있어

포그라운드를 이용해서 구현을 하였습니다

 

이러한 포그라운드를 이용하는데 연속된 데이터를 전송할 때

기존 Activity에서는 Handler를 이용해서 지연을 발생시켰습니다

 

new Handler(){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
    }
}.sendEmptyMessageDelayed(0,1000);

 

위에 핸들러 지연 코드를 이용하면 두개의 메시지를 시간차를 두고 보낼 수 있습니다

 

mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
new Handler(){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
    }
}.sendEmptyMessageDelayed(0,1000);

 

하지만 포그라운드에서는 첫 번째 메시지만 전송되고

두 번째 핸들러를 통한 메시지는 전송되지 않았는데 이유는

포그라운드 내에서 핸들러 루프가 멈춘다는 점이었습니다

 

즉 OS의 전원 관리 시스템 등으로 인해서 루프를 돌리는 프로그램은

자동적으로 소멸하거나 정지된다는 내용을 찾았습니다

 

하지만 위 내용은 100% 맞는 말은 아닌 것이 onStartCommand 함수 내에서는

해당 핸들러 딜레이 방식이 잘 동작합니다

 

정확한 원인은 블루투스 서비스와의 연동 부분이 문제 되는 것으로

해당 핸들러 딜레이를 BluetoothGattCallback 내에 구현했을 때 정지되는 문제가 발생했습니다

 

mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), wakeup_data);
try {
    Thread.sleep(100);
    mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

핸들러로는 작업이 중지되지만 Thread.sleep을 사용하면 두 개의 메시지가 잘 전송됩니다

만약 포그라운드에서 핸들러를 이용한 지연이 되지 않는다면 Thread.sleep을 사용하시면 됩니다

 

왜 BluetoothGattCallback내에서 루프 프로그램이 돌지 않는지에 대해서는

추후에 이유를 더 알아보고 분석하여 다시 포스팅하도록 하겠습니다

728x90
반응형

댓글