Activity和Fragment

Activity

01 生命周期

典型情况下的生命周期
  • onCreate 表示Activity正在被创建,当Activity第一次启动的时候触发
  • onRestart: 当处于停止状态的Activity需要再次展现给用户的时候,触发该方法,即从不可见变成可见时会执行此方法
  • onStart:这时Activity已经可见了,但是没有出现在前台,但没有得到焦点,还无法和用户交互。
  • onResume: 表示Activity已经可见,Activity得到焦点,可以与用户交互
  • onPause: Activity失去焦点,无法再与用户交互,但依然可见
  • onStop:Activity不可见,进入后台;如果内存紧张,系统会直接结束这个Activity,而不会触发onStop 方法,所以保存状态信息是应该在onPause 时做,而不是onStop 时做,在一些情况下,onPause 方法或许是Activity触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
  • onDestroy:Activity被销毁

1.如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?
onStart()和onStop() 。Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。
2.如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause还是在onStop执行这个操作好呢?
onPause(), 如果内存紧张的时候,系统会直接结束这个Activity,不会触发onStop()方法
3.简单说一下Activity A启动Activity B时,两个Activity生命周期的变化
Activity A 的 onPause方法执行。
Activity B 的 onCreate、onStart和 onResume方法依次执行。
然后,如果 Activity A 在屏幕上不再可见,则其 onStop方法执行。

完整生命周期:
1.第一次启动一个Activity:onCreate->onStart->onResume
2.打开新的Activity或者切换到桌面的时候:onPause->onStop
3.当用户再次回到原Activity:onRestart->onStart->onResume
4.当用户按back键回退时:onPause->onStop->onDestroy
5.可视生命周期(visible lifetime):onStart->onResume->onPause->onStop
6.前台生命周期(foreground lifetime):onResume->onPause

异常情况下的生命周期

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
当系统配置发生改变后,activity会被销毁,其onPause,onStop,onDestroy均会被调用,由于在异常情况下终止的,系统会调用onSaveInstanceState来保存当前activity的状态,调用时机在onStop之前;activity被重新创建后,系统会调用onRestoreInstanceState,将activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。
2.资源内存不足导致低优先级的activity被杀死
Activity优先级从高到低:前台Activity->可见但非前台Activity->后台Activity
注:当系统配置发生改变时,让Activity不会被重新创建?
指定android:configChanges="orientaion | keyboardHidden"

02 启动模式LaunchMode

1.standard:标准模式,是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
2.singleTop:栈顶复用模式。如果新Activity位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被调用。
3.singleTask: 栈内复用模式。只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,具有clearTop效果。
4.singleInstance:单实例模式。具有singleTask模式的所有特性,还就是具有此种模式的Activity只能单独地位于一个任务栈中。
任务栈分为:前台任务栈和后台任务栈
taskAffinity 任务栈名称,默认为包名

Activity的Flags

FLAG_ACTIVITY_NEW_TASK:singleTask启动模式
FLAG_ACTIVITY_SINGLE_TOP:singleTop启动模式
FLAG_ACTIVITY_CLEAR_TOP:在同一个任务栈中所有位于它上面的Activity都要出栈

IntentFilter的匹配规则

隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。IntentFilter中的过滤信息有action,category,data;
一个过滤列表中的action,category和data可以有多个,还有一个Activity可以有多个intent-filter
1.action的匹配规则
action的匹配规则要求Intent中的action存在且必须和过滤规则中的其中一个action相同;
2.category的匹配规则
Intent可以没有category,如果一旦有category,那么必须和过滤规则中的任何一个相同。
3.data的匹配规则
Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data.

Fragment

1 Fragment概要

为了解决Android碎片化
它可作为Activity界面的组成部分,可在Activity运行中实现动态地加入、移除和替换
一个Activity中可同时出现多个Fragment,一个Fragment也可在多个Activity中使用

2 Fragment生命周期
Activity和Fragment_第1张图片
image.png

Activity和Fragment_第2张图片
image.png

Activity和Fragment_第3张图片
image.png

Activity和Fragment_第4张图片
image.png
3 加载Fragment方法

1.静态加载:在托管Activity的layout文件中声明Fragment
2.动态加载:在托管Activity通过代码动态添加

4 Fragment与Activity之间通信

如果想得到静态加载碎片的实例:
MyFragment myFragment = (MyFragment)getFragmentManager(). findFragmentById(R.id.fragment);
如果想得到动态加载碎片的实例:
MyFragment myFragment = (MyFragment)fragmentManager(). findFragmentById(R.id.layout);
想在MyFragment得到MainActivity的实例:
MainActivity activity=(MainActivity)getActivity();
先在一个碎片中可以得到与它相关联的活动,然后再通过这个活动去获取另外一个碎片的实例,这样实现了不同碎片之间的通信了。
Fragment中使用接口回调方式

5 Fragment回退栈

FragmentTransaction.addToBackStack(String)【把当前事务的变化情况添加到回退栈】
调用tx.addToBackStack(null)将当前的事务添加到了回退栈,如果不添加事务到回退栈,前一个Fragment实例会被销毁

6 处理运行时配置发生变化

当屏幕发生旋转,Activity发生重新启动,默认的Activity中的Fragment也会跟着Activity重新创建
解决方法

public class MainActivity extends Activity {

    private static final String TAG = "FragmentOne";  
    private FragmentOne mFOne;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);  

        Log.e(TAG, savedInstanceState+"");  

        if(savedInstanceState == null) {  
            mFOne = new FragmentOne();  
            FragmentManager fm = getFragmentManager();  
            FragmentTransaction tx = fm.beginTransaction();  
            tx.add(R.id.id_content, mFOne, "ONE");  
            tx.commit();  
        }  
    }  
}

Activity面试汇总, 打牢那些被易忘的基础知识

你可能感兴趣的:(Activity和Fragment)