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

NavController을 이용하여 Fragment 전환시 프래그먼트 종료로 BLE 통신이 끊어집니다.

0 추천

device fragment에서 scan activity를 호출하여 BLE를 스캔/선택하고,

ble address를 device fragment에서 device control fragment로 전송하여 BLE 통신을 연결합니다.(service 사용)

통신을 연결하여 데이터를 주고 받을 수 있습니다.

그런데 다른 fragment로 전환하며 BLE 통신이 끊어집니다. 

Toast.makeText 로 확인해보니 fragment 전환 시 onDestroy() 와 onDetach()까지 호출되어서 해당 fragment가 종료되네요.

device fragment에서 BLE 연결을 하고, 

다른 fragment로 이동하더라도 ble 통신이 계속 연결되어서 data를 주고 받고 싶은데, 

방법을 모르겠습니다.

        BottomNavigationView navView = findViewById(R.id.nav_view); 
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_device, R.id.navigation_search, R.id.navigation_community, R.id.navigation_my)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(binding.navView, navController);
    }
}

다른 블로그에서 찾은 방법으로는

fragment 전화 시 hide으로 감추는 방식으로 BLE 연결을 유지가 되지만,

BLE 연결이 되면 다른 fragment로 전환이 안되었습니다.

    private FragmentManager fragmentManager;
    private HomeFragment fragmentHome;
    private DeviceFragment fragmentDevice;
    private SearchFragment fragmentSearch;
    private CommunityFragment fragmentCommunity;
    private MyFragment fragmentMy;    
            switch(menuItem.getItemId())
            {
                case R.id.navigation_home:
                    if(fragmentManager.findFragmentByTag("Home") != null){                        fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("Home")).commit();
                    }
                    else {
                        fragmentHome = new HomeFragment();
                        fragmentManager.beginTransaction()
                                .add(R.id.nav_host_fragment_activity_main, fragmentHome, "Home")
                                .commit();
                    }
                    if(fragmentManager.findFragmentByTag("Device") != null){
                        fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("Device")).commit();
                    }
                    if(fragmentManager.findFragmentByTag("Search") != null){
                        fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("Search")).commit();
                    }
                    if(fragmentManager.findFragmentByTag("Community") != null){
                        fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("Community")).commit();
                    }
                    if(fragmentManager.findFragmentByTag("My") != null){
                        fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag("My")).commit();
                    }

                    return true;                
봄이오면 (120 포인트) 님이 2021년 11월 1일 질문
화면전환과 관계없이 애플리케이션 레벨에서 BLE가 계속 살아있으려면 서비스를 이용하셔야 할 것 같은데요. 액팁비티나 프레그먼트에서 해당 부분을 제어하려고 하면 라이프사이클 때문에 쉽지 않을 뿐더러 별로 권장하고 싶지 않습니다. 백그라운드에 데이터를 계속 받을 수 있도록 서비스와 같이 전역적으로 애플리케이션 실행동안 살아남을 수 있는 방법을 사용하시는게 맞을 것같아요. 몇 일전에도 같은 질문을 어떤 분이 하셔서 답글을 달아드렸었던 기억이 있어요.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...