OnCreate与OnDestroy
OnCreate:创建一个活动。
OnDestroy:销毁一个活动。
假设某个用户在一个活动里输入了一些信息,用户由于某些原因退出了该活动,返回时希望能够还原之前输入的信息,不然重新输入就太麻烦了。
public class LetterActivity extends Activity {
public final String LETTER_RECORD = "letter_record";
private SharedPreferences mSharedPreferences;
EditText mLetterText;
Button mLetterButton;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_letter);
mLetterText = this.findViewById(R.id.letter_text);
mLetterButton = this.findViewById(R.id.letter_button);
mLetterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = mLetterText.getText().toString().trim();
}
});
mSharedPreferences = this.getSharedPreferences(LETTER_RECORD, MODE_PRIVATE);
if (mSharedPreferences != null) {
String record = mSharedPreferences.getString("record", null);
if (!TextUtils.isEmpty(record)) {
mLetterText.setText(record);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
String content = mLetterText.getText().toString().trim();
if (TextUtils.isEmpty(content)) {
return;
}
mSharedPreferences = this.getSharedPreferences(LETTER_RECORD, MODE_PRIVATE);
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("record", content);
editor.apply();
}
}
从以上代码可以看到:
onDestroy:在活动销毁时,将用户输入的内容通过持久化的方式存起来。
onCreate:在活动创建时,如果已经有持久化存储的内容,就把该内容取出并赋值到输入栏里。
Onstart,OnStop与OnResume,OnPause
OnStart:活动开始可见
OnStop:活动不可见
OnResume:活动获得焦点
OnPause:活动失去焦点
这里举最常见的case。
case1:桌面点击启动一个活动,触发onCreate->onStart->OnResume
首先创建活动,随后活动可见,之后活动获得焦点。
case2:全面屏手机左滑/非全面屏手机点back键:触发onPause->onStop
首先失去焦点,随后不可见。但是活动还在后台运行,因此没有onDestroy。
case3:全面屏手机上滑/非全面屏手机点home键,触发onPause->onStop,与上一条同理。也就是说活动只要进入后台,就会走到onStop状态。
case4:活动跳转到另一个透明活动,触发onPause。可以通过以下代码设置成一个透明活动。
<activity android:name=".LetterActivity" android:theme="@android:style/Theme.Translucent"/>
这种情况就是典型的,活动依旧可见,但是失去了焦点,不能操作。
横竖屏切换
活动在横竖屏切换时会触发一系列的状态切换:
可以看到,横竖屏切换本质上是销毁了之前的活动,并重新创建了一个新活动。
在一些场景下,比如游戏,视频播放器,不希望在转屏的时候重新创建活动,这样活动里的对象和状态与之前的都不相同了。可以在manifest里面增加配置,可以在转屏时不再触发活动状态的变化:
android:configChanges="keyboardHidden|screenSize|orientation"
任务栈
活动在启动的时候可以遵循一定规则处理活动之间的逻辑。
standard:创建新的活动时,自动移动到栈顶,退出时根据入栈顺序逐次退出。
创建多少个活动,就要点击多少次返回来退出。默认的启动模式就是这种,适用于大多数场景。
singleTop:如果栈顶已经是当前活动,就不会创建新的活动了。
适用场景:被动调用,防止多个界面同时被调用。比如通知和推送。
singleTask:如果目标活动没有创建,就创建出来放在栈顶;如果目标活动已经被创建,就把栈顶里该活动上方的活动全部移除。
适用场景:某个活动占用资源过大的情况下,保证不会重复创建该活动。
singleInstance:独立使用一个任务栈,不会再创建,在系统里只有唯一一个实例。
适用场景:输入法工具等,在每个场景都在使用。