Android Fragment探究细节

2019-05-30  本文已影响0人  落后程序员

首先我定义了一个基类,重写了一遍fragment的相关方法

public abstract class AbsV4Fragment extends Fragment {

    private Context context;

    private final static String TAG = AbsV4Fragment.class.getSimpleName();

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        WLog.i(TAG, getName() + ".onAttach");
        this.context = context;
    }

    @Override
    public void onAttachFragment(Fragment childFragment) {
        super.onAttachFragment(childFragment);
        WLog.i(TAG, getName() + ".onAttachFragment");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WLog.i(TAG, getName() + ".onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        WLog.i(TAG, getName() + ".onCreateView");
//        return super.onCreateView(inflater, container, savedInstanceState);
        return inflater.inflate(getLayoutId(), container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        WLog.i(TAG, getName() + ".onViewCreated");
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        WLog.i(TAG, getName() + ".onActivityCreated savedInstanceState is " + StringUtils.isNULL(savedInstanceState));
        initView();
        initData(savedInstanceState);
        initClick();
    }

    @Override
    public void onStart() {
        super.onStart();
        WLog.i(TAG, getName() + ".onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        WLog.i(TAG, getName() + ".onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        WLog.i(TAG, getName() + ".onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        WLog.i(TAG, getName() + ".onPause");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        WLog.i(TAG, getName() + ".onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        WLog.i(TAG, getName() + ".onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        WLog.i(TAG, getName() + ".onDetach");
    }


    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        WLog.i(TAG, getName() + ".onSaveInstanceState outState is " + StringUtils.isNULL(outState));
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        WLog.i(TAG, getName() + ".onViewStateRestored savedInstanceState is " + StringUtils.isNULL(savedInstanceState));
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        WLog.i(TAG, getName() + ".onConfigurationChanged");
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        WLog.i(TAG, getName() + ".onRequestPermissionsResult");
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        WLog.i(TAG, getName() + ".onActivityResult");
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        WLog.i(TAG, getName() + ".onLowMemory");
    }

    /**
     * 获取onAttach的context
     *
     * @return
     */
    public Context getCtx() {
        return context;
    }

    public String getName() {
        return getClass().getSimpleName();
    }


    public abstract int getLayoutId();

    public abstract void initView();

    public abstract void initData(Bundle savedInstanceState);

    public abstract void initClick();
}

activity基础类

public abstract class AbsAppCompatActivity extends AppCompatActivity {

    private final static String TAG = AbsAppCompatActivity.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WLog.i(TAG, getName() + ".onCreate savedInstanceState is " + StringUtils.isNULL(savedInstanceState));
        setContentView(getLayoutId());
        initView();
        initData(savedInstanceState);
        initClick();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        WLog.i(TAG, getName() + ".onRestart");
    }


    @Override
    protected void onStart() {
        super.onStart();
        WLog.i(TAG, getName() + ".onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        WLog.i(TAG, getName() + ".onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        WLog.i(TAG, getName() + ".onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        WLog.i(TAG, getName() + ".onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        WLog.i(TAG, getName() + ".onDestroy");
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
        WLog.i(TAG, getName() + ".onAttachFragment");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        WLog.i(TAG, getName() + ".onSaveInstanceState outState is " + StringUtils.isNULL(outState));
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        WLog.i(TAG, getName() + ".onRestoreInstanceState savedInstanceState is " + StringUtils.isNULL(savedInstanceState));
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        WLog.i(TAG, getName() + ".onActivityResult");
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        WLog.i(TAG, getName() + ".onRequestPermissionsResult");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        WLog.i(TAG, getName() + ".onConfigurationChanged");
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        WLog.i(TAG, getName() + ".onLowMemory");
    }

    public String getName() {
        return getClass().getSimpleName();
    }


    public abstract int getLayoutId();

    public abstract void initView();

    public abstract void initData(Bundle savedInstanceState);

    public abstract void initClick();
}

首先是打开了一个activity带fragment的页面,Logcat的log打印

AbsAppCompatActivity: StatusbarActivity.onCreate savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onAttach
AbsAppCompatActivity: StatusbarActivity.onAttachFragment fragment is StatusbarFragment
AbsV4Fragment: StatusbarFragment.onCreate
AbsV4Fragment: StatusbarFragment.onCreateView
AbsV4Fragment: StatusbarFragment.onViewCreated
AbsV4Fragment: StatusbarFragment.onActivityCreated savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onViewStateRestored savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onStart
AbsAppCompatActivity: StatusbarActivity.onStart
AbsAppCompatActivity: StatusbarActivity.onResume
AbsV4Fragment: StatusbarFragment.onResume

当我旋转了下屏幕(为了模拟activity重建),原本的fragment会销毁,同时创建了2个新的frament添加进来,但是只有一个onResume执行了,创建第二个的时候,第一个fragment执行了onDestroyView

AbsV4Fragment: StatusbarFragment.onConfigurationChanged
AbsAppCompatActivity: StatusbarActivity.onConfigurationChanged
AbsV4Fragment: StatusbarFragment.onPause
AbsAppCompatActivity: StatusbarActivity.onPause
AbsV4Fragment: StatusbarFragment.onSaveInstanceState outState is false
AbsAppCompatActivity: StatusbarActivity.onSaveInstanceState outState is false
AbsV4Fragment: StatusbarFragment.onPause
AbsAppCompatActivity: StatusbarActivity.onStop
AbsV4Fragment: StatusbarFragment.onDestroyView
AbsV4Fragment: StatusbarFragment.onDestroy
AbsV4Fragment: StatusbarFragment.onDetach
AbsAppCompatActivity: StatusbarActivity.onDestroy
------优雅的分割线-----
AbsV4Fragment: StatusbarFragment.onAttach
AbsAppCompatActivity: StatusbarActivity.onAttachFragment fragment is StatusbarFragment
AbsV4Fragment: StatusbarFragment.onCreate
AbsAppCompatActivity: StatusbarActivity.onCreate savedInstanceState is false
AbsV4Fragment: StatusbarFragment.onCreateView
AbsV4Fragment: StatusbarFragment.onViewCreated
AbsV4Fragment: StatusbarFragment.onActivityCreated savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onViewStateRestored savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onAttach
AbsAppCompatActivity: StatusbarActivity.onAttachFragment fragment is StatusbarFragment
AbsV4Fragment: StatusbarFragment.onCreate
AbsV4Fragment: StatusbarFragment.onDestroyView
AbsV4Fragment: StatusbarFragment.onCreateView
AbsV4Fragment: StatusbarFragment.onViewCreated
AbsV4Fragment: StatusbarFragment.onActivityCreated savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onViewStateRestored savedInstanceState is true
AbsV4Fragment: StatusbarFragment.onStart
AbsAppCompatActivity: StatusbarActivity.onStart
AbsAppCompatActivity: StatusbarActivity.onRestoreInstanceState savedInstanceState is false
AbsAppCompatActivity: StatusbarActivity.onResume
AbsV4Fragment: StatusbarFragment.onResume

当时的activity代码

class StatusbarActivity : AbsAppCompatActivity() {


    override fun getLayoutId(): Int {
        return R.layout.activity_statusbar;
    }

    override fun initView() {
        supportFragmentManager.beginTransaction()
                .addToBackStack("") //回退栈
                .replace(R.id.fragment_container, StatusbarFragment())
                .commit();
    }

    override fun initData(savedInstanceState: Bundle?) {

    }

    override fun initClick() {

    }
}

在fragment加了这个setRetainInstance(true)也是这样的log打印


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        WLog.i(TAG, getName() + ".onAttach");
        this.context = context;
        setRetainInstance(true);
    }

上一篇下一篇

猜你喜欢

热点阅读