4개의 페이지로 구성된 간답한 앱을 만들었는데 처음 실행해서 기본적인 사용을 하는데는 전혀 문제가 없답니다.
단지 앱을 실행한 후 홈 화면으로 이동 하고 휴대폰을 끈다음 몇시간 지나서 다시 앱을 실행할 경우 백그라운드에 실행된 앱이 다시 포그라운드로 올라오는데 이때 MainActivity 에서 각각의 Fragment 로 값을 전달하면 먹통이 되더군요.
디버깅이 정말 힘든건 이 현상이 매번 일어나는게 아니라 백그라운드에 오랬동안 방치 했다가 실행할때 가끔식 생긴다는 거에요. 그리고 구형 폰에서는 오히려 이런 현상이 없는데 신형 겔럭시 폰에서는 자주 발생 하고요.
제 예상에는 백그라운드에 오래 방치된 앱의 경우 OS에 의해서 Fragment 라이프 사이클에 어떤 일이 발생 되는데 제가 이 부분을 잘 모르고 코딩하고 있는거라 예상됩니다.
기본적인 코드 구성은 아래와 같습니다. 문제가 되는 부분은 백그라운드에 오랫동안 있다가 포그라운드로 돌아왔을때 dataChange() 함수를 호출해도 각 Fragment 의 UI가 새로고침 되지 않는것 입니다. 평상시에는 전혀 문제 없이 작동 합니다. 백그라운드에 1시간 이상 방치 되었다가 포그라운드로 돌아 왔을때 50% 정도의 확율로 발생 됩니다.
아래와 같은 코드 구성은 근본적인 문제가 있는걸까요?
public class MainActivity extends AppCompatActivity {
     private TubeFragment mFragment0; 
     private TubeFragment mFragment1;
     private TubeFragment mFragment2;
     private TubeFragment mFragment3;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             
             mFragment0 = Fragment.newInstance();
             mFragment1 = Fragment.newInstance();
             mFragment2 = Fragment.newInstance();
             mFragment3 = Fragment.newInstance();             
     }
     private void dataChange() {
             mFragment0.change(data); 
             mFragment1.change(data); 
             mFragment2.change(data); 
             mFragment3.change(data); 
     }
     private class MyPagerAdapter extends FragmentPagerAdapter {
            MyPagerAdapter(FragmentManager fm) {
                    super(fm);
             }
             @Override
             public int getCount() {
                     return 4;
             }
             @Override
             public Fragment getItem(int position) {
                     switch (position) {
                           case 0: return mFragment0;
                           case 1: return mFragment1;
                           case 2: return mFragment2;
                           case 3: return mFragment3;
                     }
                     return null;
             }
             @Override
             public void destroyItem(ViewGroup container, int position, Object object) {
                    super.destroyItem(container, position, object);
             }
     }
}