我正在构建一个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());
}
}
事先非常感谢。
1条答案
按热度按时间ulmd4ohb1#
我刚刚意识到,在我的代码中,我在mainactivity的oncreate中显示mapfragment,这导致应用程序崩溃。我不可能让应用程序在前台关闭飞行模式时不经历生命周期方法。但是在mainactivity的onstart中显示mapfragment解决了这个问题。
其中getcurrentfragment()是我定义的一个方法,用于返回当前显示的片段。