体验活动的生命周期及启动模式
体验活动的生命周期及启动模式
一、在实验一(案例有三个活动:启动页,登录页,注册页)的基础上进行如下更改并测试:
修改注册页,将注册页的“注册”按钮事件处理方法(onClick()方法)的代码修改如下:
regBt.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
//Intent intent3=new Intent(); //该“意图”仅仅只传递数据
//intent3.putExtra("regName",nameET.getText().toString());
//intent3.putExtra("regPwd",pwdET.getText().toString());
//setResult(RESULT_OK, intent3); //3.设置返回结果intent3,并且其中包含传递的参数
//finish();//关闭当前页面
Intent intent3 = new Intent(Register.this,Login.class);
intent3.putExtra("regName",text1.getText().toString());
intent3.putExtra("regPwd",text2.getText().toString());
startActivity(intent3);
}
});
1.运行APP后,切换到注册页活动,然后输入用户注册信息,点击“注册”按钮,此时,任务栈中活动从栈顶至栈底依次是哪些?登录页活动依次回调了哪些生命周期的方法?用户注册的信息能否用于登录?
(提示:通过按 back 键可以测试任务栈中是哪些活动。)
①修改onClick()方法前:

打开APP后,进入Login页面,登录页活动入栈;——>点击Login页面的“注册”按钮,进入Register页面,注册页活动入栈且为栈顶;——>点击Register页面的“注册”按钮,关闭当前页面,注册页活动出栈,进入Login页面,登录页为栈顶。
②修改onClick()方法后:

打开APP后,进入Login页面,登录页活动入栈;——>点击Login页面的“注册”按钮,进入Register页面,注册页活动入栈且为栈顶;——>点击Register页面的“注册”按钮,进入Login页面,新增登录页活动入栈且为栈顶。
③修改onClick()方法后back键测试如下:



2.登录页活动依次回调的生命周期的方法:
①打开APP后,进入Login页面,登录页活动入栈;

②点击Login页面的“注册”按钮,进入Register页面,注册页活动入栈且为栈顶;

③点击Register页面的“注册”按钮,关闭当前页面,注册页活动出栈,进入Login页面,登录页为栈顶。

3.用户注册的信息不能用来登录,此时只是简单跳转,不能携带信息实现传参。

二、修改清单文件,为登录页活动设置启动模式为单例模式,如下:
<activity android:name=".Login" android:launchMode="singleTask"/>
1.运行APP后,切换到注册页活动,然后输入用户注册信息,点击“注册”按钮,此时,任务栈中活动从栈顶至栈底依次是哪些?登录页活动依次回调了哪些生命周期的方法?用户注册的信息能否用于登录?
①修改onClick()方法后:
打开APP后,进入Login页面,登录页活动入栈;——>点击Login页面的“注册”按钮,进入Register页面,注册页活动入栈且为栈顶;——>点击Register页面的“注册”按钮,进入Login页面,此时栈顶不是登录页活动,但栈中存在登录页活动,在singleTask模式下,为避免重复活动入栈占用资源,于是将登录页活动上面的活动依次出栈,直到登录页活动为栈顶。

②修改onClick()方法后back键测试如下:


2.登录页活动依次回调的生命周期的方法:
①打开APP后,进入Login页面,登录页活动入栈;

②点击Login页面的“注册”按钮,进入Register页面,注册页活动入栈且为栈顶;

③点击Register页面的“注册”按钮,进入Login页面,此时栈顶不是登录页活动,但栈中存在登录页活动,在singleTask模式下,为避免重复活动入栈占用资源,于是将登录页活动上面的活动依次出栈,直到登录页活动为栈顶。

3.用户注册的信息不能用来登录。
三、改进使得登录页活动在单例模式下能利用注册页活动的信息进行登录。
提示1:通过观察,可以在生命周期方法onStart()或者onResume()中通过getIntent() 获取 intent,进而获取携带的数据。 提示2:单例模式下活动收到的 intent 是原始 intent,需要重写onNewIntent() 方法更新为新接收的 intent。
1.改进思想:
①在单例的活动之中,采用getIntent方法得到的是第一次启动该活动的Intent实例。点击Register界面的“注册”按钮,信息传回新的登录页,但是栈中已有登录页活动,不再创建此活动,堆栈之中还是重新启动原来已有的登录活动,此时获取的Intent还是旧的intent,所以需要重写onNewIntent() 方法更新为新接收的 intent。
②重写该方法之后,点击注册界面的注册按钮就会按照 onNewIntent、 onRestart 、onStart 、onResume的顺序回调这四个方法。
③由于intent传回的时间未知,所以将 onRestart 、onStart这两个登录界面特有的回调方法作为标志,里面插入我们获取注册信息的代码,这样就可以实现回调获取注册信息。

2.代码实现:
(1)在Login.java的class中添加以下代码:
//单例模式下活动收到的 intent 是原始 intent,需要重写onNewIntent() 方法更新为新接收的 intent。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// must store the new intent unless getIntent() will return the old one
setIntent(intent);
//跟新intent
}
(2)在生命周期方法onStart()或者onResume()中通过getIntent() 获取 intent,进而获取携带的数据。
@Override
protected void onResume() {
super.onResume();
Log.w(s3,"执行onResume()方法");
//在生命周期方法onStart()或者onResume()中通过getIntent() 获取 intent,进而获取携带的数据。
Intent data = getIntent();
new AlertDialog.Builder(Login.this).setTitle("注册成功")
.setMessage("成功注册账号,已自动返回登录页面。")
.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
//finish();
}
}).show();
login_name = data.getStringExtra("regName");
login_pss = data.getStringExtra("regPwd");
}
浙公网安备 33010602011771号