Activity生命周期指的是Activity从创建到销毁的整个过程,包括以下几个状态:
onCreate()
:当Activity第一次被创建时调用,用于初始化界面和数据onStart()
:当Activity变得可见时调用,但不能与用户交互。onResume()
:当Activity可见并且用户可以交互时调用,通常用于启动动画、音乐等。onPause()
:当其他Activity(或对话框)覆盖当前Activity时调用,用于保存数据和停止动画、音乐等。onStop()
:当Activity不再可见时调用,用于保存数据和释放资源。onDestroy()
:当Activity被销毁时调用,用于释放所有资源和反注册所有监听器。onRestart()
:当Activity从不可见到可见时调用,在onStop()之后调用。Activity的生命周期有多种情况,每个状态发生时都有一系列的回调方法可以让开发者进行处理
当内存不足,会以此优先级以此杀死Activity所在进程,无四大组件运行的进程,很容易被杀死
android横竖屏切换的时候Activity的生命周期
答:当Android设备的屏幕从横屏切换为竖屏,或者从竖屏切换为横屏时,Activity的生命周期会经历以下过程:
onPause()
: 在屏幕旋转之前,系统会调用当前Activity的onPause()方法。这表示Activity正在失去焦点,并即将进入停止状态。onSaveInstanceState()
: 在屏幕旋转之前,系统会调用当前Activity的onSaveInstanceState()方法,用于保存Activity的状态信息。你可以在此方法中保存必要的数据,以便在Activity重新创建后进行恢复。如果你不希望在横竖屏切换时保存数据,可以在 Activity 的清单文件中对应的标签中添加
android:configChanges
属性,并指定要忽略的配置变化。例如,可以添加 orientation 和screenSize 以忽略横竖屏切换
onStop()
: 当屏幕旋转完成并且新的布局已经加载完毕后,系统会调用当前Activity的onStop()方法。此时,Activity已经完全不可见。onDestroy()
: 如果屏幕旋转导致当前Activity被销毁并重新创建,则系统会调用当前Activity的onDestroy()方法。你可以在此方法中释放资源和执行清理操作。onCreate()
: 在屏幕旋转导致Activity重新创建时,系统会调用当前Activity的onCreate()方法。你可以在此方法中重新初始化UI和恢复之前保存的数据。onStart()
: 在屏幕旋转之后,系统会调用当前Activity的onStart()方法。此时,Activity已经可见,但还没有获得焦点。onResume()
: 最后,系统会调用当前Activity的onResume()方法。在此方法中,你可以恢复之前的操作,并开始响应用户的交互。当屏幕旋转时,Activity会被销毁并重新创建,因此需要适当地处理数据保存和恢复的逻辑,以保证用户体验的连续性。onSaveInstanceState()
方法保存和恢复Activity的状态信息,在onCreate()和onRestoreInstanceState()
方法中进行处理。
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可以使用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);
接收数据的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"); //获取布尔类型数据
需要注意的是,如果启动目标Activity时,不需要返回结果,则可以直接调用startActivity(intent)
方法;如果需要返回结果,则需要使用startActivityForResult(intent, requestCode)
方法,并在目标Activity中重写onActivityResult(requestCode, resultCode, data)
方法来处理返回结果。
在Activity和Fragment之间传递数据,可以使用Bundle或接口回调。
在Activity中:
Bundle bundle = new Bundle();
bundle.putString("key", "value");
Fragment fragment = new MyFragment();
fragment.setArguments(bundle);
在Fragment中:
String value = getArguments().getString("key");
在Activity中定义接口:
public interface OnDataReceivedListener {
void onDataReceived(String data);
}
在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");
}
在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);
}
}