Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 活动和片段生命周期和方向变化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经有非常奇怪的问题,片段和方向的变化已经导致强制关闭,而不是遵循逻辑模式.

我创建了一个简单的Activity和Fragment生命周期调试应用程序,它通过报告对logcat的调用来简单地实现Activity lifecycleFragment lifecycle的每一个步骤.

以下是TestActivity和TestFragment类:

测试活动

public class TestActivity extends Activity {
    Context ct = null;


    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);

        Log.e("ACT","onCreate called");

        ct = getApplicationContext();

        FrameLayout fl = new FrameLayout(ct);
        fl.setId(1000);

        TestFragment tf = new TestFragment();
        getFragmentManager().begintransaction().add(fl.getId(),tf,"").commit();

        setContentView(fl);
    }

    @Override
    protected void onStart() {
        Log.e("ACT","onStart called");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("ACT","onResume called");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.e("ACT","onPause called");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("ACT","onStop called");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e("ACT","onDestroy called");
        super.onDestroy();
    }

    @Override
    protected void onRestart() {
        Log.e("ACT","onRestart called");
        super.onRestart();
    }
}

TestFragment

public class TestFragment extends Fragment {
    Context ctFrag = null;

    @Override
    public void onAttach(Activity activity) {
        Log.e("FRAG","onAttach called");
        super.onAttach(activity);
    }

    @Override
    public void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);

        Log.e("FRAG","onCreate called");

    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceStatE) {
        Log.e("FRAG","onCreateView called");

        ctFrag = ((TestActivity) getActivity()).ct;

        TextView tv = new TextView(ctFrag);
        tv.setText("My test TextView");

        return tv;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceStatE) {
        Log.e("FRAG","onActivityCreated called");
        super.onActivityCreated(savedInstanceStatE);
    }

    @Override
    public void onStart() {
        Log.e("FRAG","onStart called");
        super.onStart();
    }

    @Override
    public void onResume() {
        Log.e("FRAG","onResume called");
        super.onResume();
    }

    @Override
    public void onPause() {
        Log.e("FRAG","onPause called");
        super.onPause();
    }

    @Override
    public void onStop() {
        Log.e("FRAG","onStop called");
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        Log.e("FRAG","onDestroyView called");
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        Log.e("FRAG","onDestroy called");
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        Log.e("FRAG","onDetach called");
        super.onDetach();
    }
}

在初始化时,Logcat输出遵循预期顺序(启动活动,分片附加,生命周期调用发生等):

01-29 10:12:50.270: E/ACT(3321): onCreate called
01-29 10:12:50.760: E/FRAG(3321): onAttach called
01-29 10:12:50.760: E/FRAG(3321): onCreate called
01-29 10:12:50.760: E/FRAG(3321): onCreateView called
01-29 10:12:50.770: E/FRAG(3321): onActivityCreated called
01-29 10:12:50.770: E/ACT(3321): onStart called
01-29 10:12:50.770: E/FRAG(3321): onStart called
01-29 10:12:50.770: E/ACT(3321): onResume called
01-29 10:12:50.770: E/FRAG(3321): onResume called

但问题是,当一个方向改变发生时,Android Documentation说:

这将表明它应该关闭活动及其内容,如生命周期建议(然后它)然后通过相同的有序过程重新创建活动在新的方向.这不会发生,似乎尝试重新创建片段,然后在活动娱乐中创建新的片段.

01-29 10:17:52.249: E/FRAG(3321): onPause called
01-29 10:17:52.259: E/ACT(3321): onPause called
01-29 10:17:52.269: E/FRAG(3321): onStop called
01-29 10:17:52.269: E/ACT(3321): onStop called
01-29 10:17:52.279: E/FRAG(3321): onDestroyView called
01-29 10:17:52.299: E/FRAG(3321): onDestroy called
01-29 10:17:52.299: E/FRAG(3321): onDetach called
01-29 10:17:52.299: E/ACT(3321): onDestroy called
01-29 10:17:52.650: E/FRAG(3321): onAttach called
01-29 10:17:52.650: E/FRAG(3321): onCreate called
01-29 10:17:52.650: E/ACT(3321): onCreate called
01-29 10:17:53.020: E/FRAG(3321): onCreateView called
01-29 10:17:53.020: E/FRAG(3321): onActivityCreated called
01-29 10:17:53.030: E/FRAG(3321): onAttach called
01-29 10:17:53.030: E/FRAG(3321): onCreate called
01-29 10:17:53.030: E/FRAG(3321): onCreateView called
01-29 10:17:53.030: E/FRAG(3321): onActivityCreated called
01-29 10:17:53.060: E/ACT(3321): onStart called
01-29 10:17:53.060: E/FRAG(3321): onStart called
01-29 10:17:53.060: E/FRAG(3321): onStart called
01-29 10:17:53.060: E/ACT(3321): onResume called
01-29 10:17:53.060: E/FRAG(3321): onResume called
01-29 10:17:53.060: E/FRAG(3321): onResume called

显然有很多解决方案可以解决这个问题,但是我的问题是为什么会发生这种情况?为什么一个片段引用被保留并重新创建,当它应该是该Activity的一部分,这被认为是完全被破坏和重新创建的?我可以通过故意将活动分开的碎片证明这一点.但是引发问题的原因是为什么在活动之前附加并重新创建了原始片段?它似乎并没有遵循Android进程的其余部分的逻辑生命周期.

解决方法

是因为活动在销毁之前调用onSaveInstanceState(BundlE).认情况下,该活动在此方法中保存其片段的状态.

稍后,当活动重新创建时,旧的片段将在活动onCreate(Bundle savedInstanceStatE)方法中重新创建.

可能需要检查源代码herehere以更好地了解此行为.

大佬总结

以上是大佬教程为你收集整理的android – 活动和片段生命周期和方向变化全部内容,希望文章能够帮你解决android – 活动和片段生命周期和方向变化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。