当前位置:   article > 正文

Android中activity详解_android activity

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/697979
推荐阅读
相关标签
  

闽ICP备14008679号