Android 包含Fragment的Activity用startActivityForResult启动别的Activity,然后返回的生命周期调用

    科技2025-08-02  16

    今天做公司一个需求的时候有这个需求,Activity包含Fragment,startActivityForResult跳转新的Activity,然后返回。需要弄清楚是先执行到onActivityResult还是onResume,就自己弄了个demo看一下。顺便把其他的生命周期都打印出来看看,以后都用得着。

    FirstActivity.java

    public class FirstActivity extends Activity { private static final String TAG = "testForFirstActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_first_layout); Log.d(TAG, "onCreate"); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.framelayout, new FirstFragment(), "0"); transaction.commitAllowingStateLoss(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult:requestCode=" + requestCode + ",resultCode=" + resultCode); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } }

    可以看到FirstActivity包含一个FirstFragment,每个生命周期方法都加了log

    FirstFragment.java

    public class FirstFragment extends Fragment { private static final String TAG = "testForFirstFragment"; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); View rootView = inflater.inflate(R.layout.test_first_fragment_layout, container, false); rootView.findViewById(R.id.test_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivityForResult(new Intent(getActivity(), SecondActivity.class), 0);//1 } }); return rootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated"); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult:requestCode=" + requestCode + ",resultCode=" + resultCode); } @Override public void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override public void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override public void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } }

    界面很简单,只有一个按钮

     

    按钮的作用就是跳转SecondActivity

    启动FirstActivity可以看到log如下

    可以看到先执行Activity的onCreate,再执行Fragment的onCreateView,接着是Fragment的onActivityCreated。Activity和Fragment的onStart和onResume顺序执行。

    从FirstActivity跳转到SecondActivity可以看到

    首先执行Activity和Fragment的onPause方法,然后才是SecondActivity的onCreate、onStart、onResume,最后是Activity和Fragment的onStop。

    所以启动新的Activity的时候不要在当前的Activity和Fragment的onPause中执行太多逻辑,否则会拖慢新的界面的展示,有时候就会显得卡顿,点了界面等会才出现。当然新界面的初始化的时候最好也不要做太多阻塞主线程的操作,可以延时、子线程来加载费时资源。

    这里说下,onStart方法表示Activity已经绘制完毕,但是还没有出现在前台,无法和用户交互。Activity已经显示出来,但是我们还看不到;onResume表示Activity已经来到前台,可以和用户交互了。

    public class SecondActivity extends Activity { private static final String TAG = "testForSecondActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_first_fragment_layout); Log.d(TAG, "onCreate"); Button button = findViewById(R.id.test_btn); button.setText("返回FirstActivity"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setResult(1); finish(); } }); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } }

    SecondActivity也只有一个按钮,设置Result,然后finish

    点击按钮,得到log

    可以看到SecondActivity也是先执行onPause方法

    FirstFragment执行了onActivityResult方法,然后是Activity的onRestart、onStart,Fragment的onStart(Fragment没有onRestart方法),然后是它们的onResume。最后是SecondActivity的onStop、onDestroy。

     

    了解这些生命周期可以更好的处理界面之间启动跳转、返回的逻辑,掌握一下还是有用的。

     

    Processed: 0.037, SQL: 8