活动的生命周期和启动
实验目的
理解Android Studio的活动调用过程和生命周期
实验内容
1、通过在不同的活动之间的转换,观察onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况。
2、通过实验说明存在系统可能自行对活动运行onDestroy。
3、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
4、通过实验说明活动的standard, singleTop, singleTask三种启动模式之间的区别点。
5、说明活动singleInstance启动模式的功能
实验步骤
一、新建Activity并初始化
1.在activity中new两个新empty activity,重命名为normal和dialog
2.在两个activity的layout中分别添加不同的显示,这里在Normal中添加textView,dialog中不用做修改,用以弹出对话框即可,但是要在Manifest里更改activity样式。
<activity android:name=".dialog"
android:theme="@style/Theme.AppCompat.Dialog"
></activity>
3.在value-strings中添加两个词条,用以快速连接text
<string name="button_normal_name">Goto normal activity</string>
<string name="button_dialog_name">Goto dialog activity</string>
4.在MainActivity中添加两个button,分别点击text右侧的长条选择上述两个词条
5.最后添加代码,new两个button,并新建点击事件setOnClickListener
@Override
protected void onCreate(@NonNull Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button) findViewById(R.id.button_normal);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,normal.class);
startActivity(intent);
}
});
Button button1=(Button) findViewById(R.id.button_diolog);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1=new Intent(MainActivity.this,diolog.class);
startActivity(intent1);
}
});
}
}
二、尝试初运行并添加对话回显
1.试运行很明显分为三个界面。分别如下:
(1)主界面
(2)普通界面
(3)对话框界面(半透明)
2.为了研究onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况,添加如下代码用以回显
public static final String TAG = "1812190523";
@Override
protected void onDestroy(){
super.onDestroy();
Log.d(TAG,"onDestroy:");
}
@Override
protected void onResume(){
super.onResume();
Log.d(TAG,"onResume:");
}
@Override
protected void onPause(){
super.onPause();
Log.d(TAG,"onPause:");
}
@Override
protected void onStop(){
super.onStop();
Log.d(TAG,"onStop:");
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG,"onStart:");
}
@Override
protected void onRestart(){
super.onRestart();
Log.d(TAG,"onRestart:");
}
在 onCreate里创建如下:
Log.d(TAG,"onCreate:");
在button中添加
tmpData="I am changed";
在button1中添加
Log.d(TAG,tmpData);
三、在活动间切换&调试
---------- 在Logcat中筛选词条后即可观察 ----------
前言:科普一下Activity的四种状态:
1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并,可与用户交互的激活装态;
2.Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,他仍然可见,但是它已经失去焦点,故不可与用户交互。
3.Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
4.Killed状态: Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动CIA可以显示和使用。
以上四种状态,Running状态和Paused状态是课件的,Stopped状态和Killed状态时不可见的。
摘自https://blog.csdn.net/u014419014/article/details/78840218
1.首先打开软件,看到如下步骤
2.打开normal界面
3.退出normal界面
4.打开对话框
5.退出对话框
6.退出程序
看过前面的科普应该很容易理解实验结果,不再赘述
四、验证系统可能自行对活动运行onDestroy
直接举例,在主界面中,直接用屏幕翻转功能
五、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
首先在第四点的条件下,系统直接destroy会销毁数据。比如说先调用button的tmpData赋值语句后(I am changed),再调用button1中的Log.d时显示的也是I am changed,但是经过一次屏幕翻转就会清空这个tmpData的值,直接调用button1会显示I am original。
这时候,可以用saveinstantstate。
并再添加字符串提取
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString("IS",tmpData);
}
在 onCreate里创建如下:
if(savedInstanceState!=null){
String tmp=savedInstanceState.getString("IS");
Log.d(TAG,tmpData);
}
这两个的作用呢,是在不是发自用户的destroy后查找已经被赋值的语句,存储到名为IS的一个字符串中,并再重新启动后赋值。
六、standard, singleTop, singleTask三种启动模式之间的区别点
直接贴代码,新建一个自己调用自己的活动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
在下图中,可以设置launch mode为standard, singleTop, singleTask,singleInstance
<activity android:name=".MainActivity"
android:launchMode="*******"
>
standard模式很好理解,相当于没有任何限制
在如下代码的情况下,只要你单击button就会一直产生新窗口界面(可以通过返回确认页面数)
<activity android:name=".MainActivity"
android:launchMode="standard"
>
single top也很好理解,相当于限制置顶页面的创建,因为当前页面是置顶页面,那么就不能通过自己调用自己产生新的置顶页面
<activity android:name=".MainActivity"
android:launchMode="singleTop"
>
singletask也很好理解,就是这个活动只能存在一个,在single top模式下,通过其他函数仍可以创建新的自己,但是在单task模式下,无论如何都只能同时存在1个
<activity android:name=".MainActivity"
android:launchMode="singleTask"
>
附加题:singleInstance
singleInstance与singletask基本一致,但是singleinstance存在于另一任务栈中
比如activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的activity,除非这个独特的任务栈被系统销毁了
实验的话可以通过新建一个activity2页面设置为singleInstance模式,并设置任务id回显即可