• Android中activity详解


    Activity正常的生命周期

    Activity生命周期指的是Activity从创建到销毁的整个过程,包括以下几个状态:

    1. onCreate():当Activity第一次被创建时调用,用于初始化界面和数据
    2. onStart():当Activity变得可见时调用,但不能与用户交互。
    3. onResume():当Activity可见并且用户可以交互时调用,通常用于启动动画、音乐等。
    4. onPause():当其他Activity(或对话框)覆盖当前Activity时调用,用于保存数据和停止动画、音乐等。
    5. onStop():当Activity不再可见时调用,用于保存数据和释放资源。
    6. onDestroy():当Activity被销毁时调用,用于释放所有资源和反注册所有监听器。
    7. onRestart():当Activity从不可见到可见时调用,在onStop()之后调用。

    Activity的生命周期有多种情况,每个状态发生时都有一系列的回调方法可以让开发者进行处理

    Activity会自动到onDestroy生命周期的情况

    1. 当用户主动销毁Activity时,例如按下返回键或调用finish()方法。
    2. 当系统由于内存不足而销毁Activity时,此时系统会按照一定的优先级来销毁Activity,优先级低的Activity会被先销毁。
    3. 当配置发生变化时,例如屏幕旋转或语言切换等,系统会销毁当前的Activity并重新创建一个新的Activity实例。

    Activity优先级分为三级

    1. 前台Activity-与用户正在交互
    2. 可见但非前台Activity-比如说弹出一个对话框,导致Activity可见但与用户不可交互
    3. 后台Activity-已经被暂停的Activity,比如说执行了onStop,优先级最低

    当内存不足,会以此优先级以此杀死Activity所在进程,无四大组件运行的进程,很容易被杀死

    Activity异常情况下生命周期

    android横竖屏切换的时候Activity的生命周期
    答:当Android设备的屏幕从横屏切换为竖屏,或者从竖屏切换为横屏时,Activity的生命周期会经历以下过程:

    1. onPause(): 在屏幕旋转之前,系统会调用当前Activity的onPause()方法。这表示Activity正在失去焦点,并即将进入停止状态。
    2. onSaveInstanceState(): 在屏幕旋转之前,系统会调用当前Activity的onSaveInstanceState()方法,用于保存Activity的状态信息。你可以在此方法中保存必要的数据,以便在Activity重新创建后进行恢复。

    如果你不希望在横竖屏切换时保存数据,可以在 Activity 的清单文件中对应的标签中添加android:configChanges 属性,并指定要忽略的配置变化。例如,可以添加 orientation 和screenSize 以忽略横竖屏切换

    1. onStop(): 当屏幕旋转完成并且新的布局已经加载完毕后,系统会调用当前Activity的onStop()方法。此时,Activity已经完全不可见。
    2. onDestroy(): 如果屏幕旋转导致当前Activity被销毁并重新创建,则系统会调用当前Activity的onDestroy()方法。你可以在此方法中释放资源和执行清理操作。
    3. onCreate(): 在屏幕旋转导致Activity重新创建时,系统会调用当前Activity的onCreate()方法。你可以在此方法中重新初始化UI和恢复之前保存的数据。
    4. onStart(): 在屏幕旋转之后,系统会调用当前Activity的onStart()方法。此时,Activity已经可见,但还没有获得焦点。
    5. onResume(): 最后,系统会调用当前Activity的onResume()方法。在此方法中,你可以恢复之前的操作,并开始响应用户的交互。

    当屏幕旋转时,Activity会被销毁并重新创建,因此需要适当地处理数据保存和恢复的逻辑,以保证用户体验的连续性。onSaveInstanceState()方法保存和恢复Activity的状态信息,在onCreate()和onRestoreInstanceState()方法中进行处理。

    Activity四大启动模式

    • Standard:标准模式(系统默认模式),当启动一个Activity,就会创建一个实例,无论实例是否已存在。Standard的Activity默认进入启动它的Activity所属的工作栈中(若ActivityA启动了ActivityB(标准模式),ActivityB就会进入ActivityA的工作栈)
    • SingleTop:栈顶复用模式,当此Activity位于栈顶时,将不会创建新实例,同时回调它的onNewIntent方法,通过此参数可以取出当前请求的信息。但若此Activity不位于栈顶,将会重新创建
    • SingleTask:栈内复用模式,单实例模式,若有Activity所需任务栈,则看此Activity是否存在于栈中,当此Activity存在,则调用此Activity位于栈顶,若此Activity未存在于栈中,则创建此Activity实例压入栈中(默认有clearTop效果,将位于它之上的Activity全部出栈)
    • SingleIntance:单独实例模式,加强版SingleTask模式,此种模式的Activity只能单独存在于一个工作栈,且不许后续创建新Activity

    Activity传递数据

    • Activity发送数据:

    可以使用Intent对象在Activity之间传递数据,并且Intent支持传递多种数据类型,包括基本数据类型和自定义对象等。以下是一个示例:

    //在Activity A 中发送数据到 Activity B
    Intent intent = new Intent(A.this, B.class);
    intent.putExtra("key", "value"); //传递字符串数据
    intent.putExtra("number", 200); //传递数字数据
    Bundle bundle = new Bundle();
    bundle.putBoolean("boolean", true); //传递布尔类型数据
    intent.putExtras(bundle);
    startActivity(intent);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • Activity接收数据:

    接收数据的Activity需要通过调用getIntent()方法获取Intent对象,再通过getXXXExtra()方法获取传递的数据。以下是一个示例:

    //在Activity B 中接收Activity A 传递过来的数据
    Intent intent = getIntent();
    String str = intent.getStringExtra("key"); //获取字符串数据
    int num = intent.getIntExtra("number", 0); //获取数字数据,默认值为0
    Bundle bundle = intent.getExtras();
    boolean bool = bundle.getBoolean("boolean"); //获取布尔类型数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要注意的是,如果启动目标Activity时,不需要返回结果,则可以直接调用startActivity(intent)方法;如果需要返回结果,则需要使用startActivityForResult(intent, requestCode)方法,并在目标Activity中重写onActivityResult(requestCode, resultCode, data)方法来处理返回结果。

    Activity和Fragment之间传递数据

    在Activity和Fragment之间传递数据,可以使用Bundle或接口回调。

    1. 使用Bundle传递数据:

    在Activity中:

    Bundle bundle = new Bundle();
    bundle.putString("key", "value");
    Fragment fragment = new MyFragment();
    fragment.setArguments(bundle);
    
    • 1
    • 2
    • 3
    • 4

    在Fragment中:

    String value = getArguments().getString("key");
    
    • 1
    1. 使用接口回调传递数据:

    在Activity中定义接口:

    public interface OnDataReceivedListener {
        void onDataReceived(String data);
    }
    
    • 1
    • 2
    • 3

    在Fragment中:

    private OnDataReceivedListener listener;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnDataReceivedListener) {
            listener = (OnDataReceivedListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnDataReceivedListener");
        }
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }
    
    private void sendData() {
        listener.onDataReceived("Data");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在Activity中实现OnDataReceivedListener接口:

    public class MainActivity extends AppCompatActivity implements MyFragment.OnDataReceivedListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, new MyFragment());
            fragmentTransaction.commit();
        }
    
        @Override
        public void onDataReceived(String data) {
            Log.d("MainActivity", "Data received: " + data);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    代码随想录:二叉树11-12
    管控软件开发进度 4大关键项需要重视
    1985-2023年6月全球各国经济政策不确定性数据
    Design Master V0.1发布--文本转图像接口
    iOS AVAudioSession 详解
    ai智能电话语音机器人,ai外呼机器人怎么用
    FastAPI 学习之路(七)字符串的校验
    Diffusion Autoencoders: Toward a Meaningful and Decodable Representation
    各种信息论坛
    Apache SeaTunnel 2.3.5 Zeta-Server集群环境搭建与使用
  • 原文地址:https://blog.csdn.net/weixin_74239923/article/details/134417539