为什么android应用程序在关闭飞行模式时会经历活动和片段生命周期方法

l7mqbcuq  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(310)

我正在构建一个android应用程序,一件令人惊讶的事情是,当我在前台关闭飞行模式时,它会崩溃。我尝试在活动的各种生命周期方法中包含日志( onPause , onCreate , onResume )对于显示活动 onCreate . 所有这些回调方法都按以下顺序调用: onPause 在显示的片段中 onPause 在主要活动中 onCreate 在主要活动中 onViewCreated 在mainactivity的
onCreate onStart 在显示的片段中 onStart 在主要活动中 onResume 在显示的片段中
应用程序终于崩溃了 onPause 在显示的片段中,由于 NullPointerException .
我试图跟踪所有这些回调,它们是由于在显示的片段的 onPause ,我将一些状态保存在SharedReferences中,以便在片段恢复时还原它们,显然它们引发了异常。
请您帮助我理解为什么当应用程序处于前台时关闭飞行模式时,应用程序会经历所有这些生命周期方法,以及在这种情况下防止应用程序崩溃的最佳方法?关于这个问题,我看了好几篇帖子,都没有找到答案。
这是密码

public class MainActivity extends AppCompatActivity{

    public static FragmentManager fragmentManager;
    public static final String LOG_TAG = "LOG_TAG";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(LOG_TAG, "Main activity created");
        super.onCreate(savedInstanceState);

        // init airplane mode receiver
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
                if(isAirplaneModeOn){
                    Log.i(LOG_TAG, "Airplane mode turned on");// handle Airplane Mode on
                } else {
                    Log.i(LOG_TAG, "Airplane mode turned off");
                }
            }
        };
        this.registerReceiver(receiver, intentFilter);

        setContentView(R.layout.activity_main);
        fragmentManager = getSupportFragmentManager();
        displayFragment(new MapFragment());
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(LOG_TAG, "Main activity paused");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(LOG_TAG, "Main activity resumed");
    }

    public void displayFragment(Fragment fragmentActivity){

        // start the transaction
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragmentActivity).
                    addToBackStack(fragmentActivity.getClass().getSimpleName()).commit();
    }
}

碎片呢

public class MapsFragment extends Fragment implements
        OnMapReadyCallback {

    public MapsFragment() {
        // Required empty public constructor
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_map, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        FrameLayout map_frame = view.findViewById(R.id.map_frame);

        // configure map
        MapView mapFragment = view.findViewById(R.id.map_view);
        mapFragment.onCreate(savedInstanceState);
        mapFragment.onResume();
        mapFragment.getMapAsync(this);
        View mapView = mapFragment.getRootView();
        super.onViewCreated(mapView, savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(LOG_TAG, "MapFragment resumed");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.i(LOG_TAG, "Map fragment paused");
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        Log.i(LOG_TAG, "onMapReadyCalled");
        MapsInitializer.initialize(getActivity());
    }
}

事先非常感谢。

ulmd4ohb

ulmd4ohb1#

我刚刚意识到,在我的代码中,我在mainactivity的oncreate中显示mapfragment,这导致应用程序崩溃。我不可能让应用程序在前台关闭飞行模式时不经历生命周期方法。但是在mainactivity的onstart中显示mapfragment解决了这个问题。

@Override
    protected void onStart() {
        super.onStart();
        if (getCurrentFragment() == null) {
            displayFragment(new MapFragment(), null, false, true);
        }
    }

其中getcurrentfragment()是我定义的一个方法,用于返回当前显示的片段。

相关问题