欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android Activity和Fragment生命周期

程序员文章站 2022-05-14 08:05:57
...

写在前边:

感觉要暂时放弃自己钟爱的computer graphics转战安卓开发了,心里还是有一点不开心。。。。但是我不会放弃CG的!!

想要把自己平时积累的知识记录下来,以便将来回来看看,同时也希望能帮到有需要的人。

正文:

在Android中,activity和fragment的生命周期一直很繁琐,有时候也是傻傻分不清楚,先贴两张图,分别对应activity和fragment的生命周期:

下图为Activity的生命周期:

Android Activity和Fragment生命周期

下图为Fragment的生命周期:


Android Activity和Fragment生命周期

通常情况下,我们要在一个Activity中的OnCreate方法里inflate一个fragment. (原谅我真的不知道中文翻译是什么-.-),然后调用getFragmentManager进行替换。这个fragment会依赖于它的宿主activity,同生同死的关系。接下来我们用一个demo来说明两者之间的联系。

情景不复杂,直接上代码吧

1. MainActivity.java

布局文件中只有一个按钮,是用来进行第二步测试的,现在可以不理会

package com.example.zach.demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction().add(R.id.content, new frag_one()).addToBackStack(null).commit();
        Log.d("Activity onCreate()", "TAG");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Activity onStart()", "TAG");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Activity onResume()", "TAG");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Activity onPause()", "TAG");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Activity onStop()", "TAG");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Activity onDestroy()", "TAG");
    }
}
2. frag_one.java

package com.example.zach.demo;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by zhangwenpurdue on 7/20/2017.
 */

public class frag_one extends Fragment {
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("Frag 1 - onAttach()", "TAG");

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag_one_layout, container, false);
        Button button = v.findViewById(R.id.gotosecond);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getFragmentManager().beginTransaction().replace(R.id.content, new frag_two()).addToBackStack(null).commit();
                //getFragmentManager().beginTransaction().replace(R.id.content, new frag_two()).commit();


            }
        });
        Log.d("Frag 1 - onCreateView", "TAG");
        return v;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        Log.d("Frag 1 - onCreate", "TAG");
    }


    @Override
    public void onStart() {
        super.onStart();
        Log.d("Frag 1 - onStart()", "TAG");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("Frag 1 - onResume()", "TAG");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("Frag 1 - onPause()", "TAG");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("Frag 1 - onStop()", "TAG");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("Frag 1 - DestroyView()", "TAG");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("Farg 1 - onDestroy()", "TAG");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("Frag 1 - onDetach()", "TAG");
    }
}
3. frag_two.java

package com.example.zach.demo;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by zhangwenpurdue on 7/20/2017.
 */

public class frag_two extends Fragment {
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("Frag 2 - onAttach()", "TAG");

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.frag_two_layout, container, false);
        Log.d("Frag 2 - onCreateView", "TAG");
        return v;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Frag 2 - onCreate", "TAG");
    }



    @Override
    public void onStart() {
        super.onStart();
        Log.d("Frag 2 - onStart()", "TAG");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("Frag 2 - onResume()", "TAG");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("Frag 2 - onPause()", "TAG");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("Frag 2 - onStop()", "TAG");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("Frag 2 - DestroyView()", "TAG");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("Frag 2 - onDestroy()", "TAG");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("Frag 2 - onDetach()", "TAG");
    }
}

当我们运行程序,mainactivity被创建,第一个fragment被添加到主页面上,此时的log是这样的:

Android Activity和Fragment生命周期


当我们点击按钮进入到第二个fragment的时候,log是这样的

Android Activity和Fragment生命周期

其中第一个fragment已经被销毁,第二个fragment 在等待状态

重点来了:假设这个时候来了个电话,是什么样的情况。 我们利用虚拟机往设备上打个电话, log一下:

Android Activity和Fragment生命周期


可以发现,activity和fragment都进入了pause 状态

接下来挂断电话,此时的log

Android Activity和Fragment生命周期

activity和fragment都进入到了resume状态。

结论:

这个就是当应用被电话打断的时候生命周期的变化。可以发现其中并没有onRestart()的参与。可以试着点击虚拟机上的home键,发现log如下:

Android Activity和Fragment生命周期

所以应用被电话打断的时候,并不restart, 但是按home键的时候,部分显示,或者全部不显示,恢复的时候才会吊桶OnRestart()方法。