运行有问题或需要源码请点赞关注收藏后评论区留言
Activity的启动和结束
通过startActivity方法可以从当前页面跳转到新页面,利用按钮控件中的点击事件去触发页面跳转。同样调用finish方法可以关闭当前页面,关闭了当前页面那么理所当然应该显示之前的页面,所以需要给箭头图标和完成按钮分别注册点击监听器,然后在onClick方法中调用finish方法。效果如下
通过点击按钮跳到ActFinishActivity类所显示的界面中
ActStartActivity类代码如下
package com.example.chapter04; import android.content.Intent; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; // 活动类直接实现点击监听器的接口View.OnClickListener public class ActStartActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_act_start); // setOnClickListener来自于View,故而允许直接给View对象注册点击监听器 findViewById(R.id.btn_act_next).setOnClickListener(this); } @Override public void onClick(View v) { // 点击事件的处理方法 if (v.getId() == R.id.btn_act_next) { // 从当前页面跳到指定的新页面 //startActivity(new Intent(ActStartActivity.this, ActFinishActivity.class)); startActivity(new Intent(this, ActFinishActivity.class)); } } }
activity_act_startXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_act_next" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="跳到下个页面" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
ActFinishActivity类代码如下
package com.example.chapter04; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; // 活动类直接实现点击监听器的接口View.OnClickListener public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_act_finish); // 给箭头图标注册点击监听器,ImageView由View类派生而来 findViewById(R.id.iv_back).setOnClickListener(this); // 给完成按钮注册点击监听器,Button也由View类派生而来 findViewById(R.id.btn_finish).setOnClickListener(this); } @Override public void onClick(View v) { // 点击事件的处理方法 if (v.getId() == R.id.iv_back || v.getId() == R.id.btn_finish) { finish(); // 结束当前的活动页面 } } }
activity_act_finishXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv_back" android:layout_width="40dp" android:layout_height="40dp" android:padding="5dp" android:src="@drawable/ic_back" /> <Button android:id="@+id/btn_finish" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="完成" android:textColor="#000000" android:textSize="17sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="按返回键,或者点击左上角的箭头图标,或者点击上面的完成按钮,均可关闭当前页面、返回上个页面" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
Activity的生命周期
App引入活动的概念而非传统的页面概念,原因在于页面更像是静态的,而活动更像是动态的。活动的生命周期行为对应的方法说明如下
onCreate 创建活动
onStart 开启活动
onResume 恢复活动
onPause 暂停活动
onStop 停止活动 活动页面不再屏幕上显示
onDestroy 销毁活动
onRestart 重启活动
onNewIntent 重启已有的活动实例
活动跳转之间的生命周期如下图
效果如下
ActLifeActivity类代码如下
package com.example.chapter04; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import com.example.chapter04.util.DateUtil; public class ActLifeActivity extends AppCompatActivity implements View.OnClickListener { private final static String TAG = "ActLifeActivity"; private TextView tv_life; // 声明一个文本视图对象 private String mStr = ""; private void refreshLife(String desc) { // 刷新生命周期的日志信息 Log.d(TAG, desc); mStr = String.format("%s%s %s %s\n", mStr, DateUtil.getNowTimeDetail(), TAG, desc); tv_life.setText(mStr); } @Override protected void onCreate(Bundle savedInstanceState) { // 创建活动页面 super.onCreate(savedInstanceState); setContentView(R.layout.activity_act_life); findViewById(R.id.btn_act_next).setOnClickListener(this); tv_life = findViewById(R.id.tv_life); // 从布局文件中获取名叫tv_life的文本视图 refreshLife("onCreate"); // 刷新生命周期的日志信息 } @Override protected void onStart() { // 开始活动 super.onStart(); refreshLife("onStart"); // 刷新生命周期的日志信息 } @Override protected void onStop() { // 停止活动 super.onStop(); refreshLife("onStop"); // 刷新生命周期的日志信息 } @Override protected void onResume() { // 恢复活动 super.onResume(); refreshLife("onResume"); // 刷新生命周期的日志信息 } @Override protected void onPause() { // 暂停活动 super.onPause(); refreshLife("onPause"); // 刷新生命周期的日志信息 } @Override protected void onRestart() { // 重启活动 super.onRestart(); refreshLife("onRestart"); // 刷新生命周期的日志信息 } @Override protected void onDestroy() { // 销毁活动 super.onDestroy(); refreshLife("onDestroy"); // 刷新生命周期的日志信息 } @Override protected void onNewIntent(Intent intent) { // 重用已有的活动实例 super.onNewIntent(intent); refreshLife("onNewIntent"); // 刷新生命周期的日志信息 } @Override public void onClick(View v) { if (v.getId() == R.id.btn_act_next) { // 从当前页面跳到指定的活动页面 startActivity(new Intent(this, ActNextActivity.class)); } } }
activity_act_lifeXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_act_next" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="跳到下个页面" android:textColor="#000000" android:textSize="17sp" /> <TextView android:id="@+id/tv_life" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
ActNextActivity类代码如下
package com.example.chapter04; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import com.example.chapter04.util.DateUtil; public class ActNextActivity extends AppCompatActivity implements View.OnClickListener { private final static String TAG = "ActNextActivity"; private TextView tv_life; // 声明一个文本视图对象 private String mStr = ""; private void refreshLife(String desc) { // 刷新生命周期的日志信息 Log.d(TAG, desc); mStr = String.format("%s%s %s %s\n", mStr, DateUtil.getNowTimeDetail(), TAG, desc); tv_life.setText(mStr); } @Override protected void onCreate(Bundle savedInstanceState) { // 创建活动 super.onCreate(savedInstanceState); setContentView(R.layout.activity_act_next); findViewById(R.id.btn_act_pre).setOnClickListener(this); tv_life = findViewById(R.id.tv_life); // 从布局文件中获取名叫tv_life的文本视图 refreshLife("onCreate"); } @Override protected void onStart() { // 开始活动 super.onStart(); refreshLife("onStart"); // 刷新生命周期的日志信息 } @Override protected void onStop() { // 停止活动 super.onStop(); refreshLife("onStop"); // 刷新生命周期的日志信息 } @Override protected void onResume() { // 恢复活动 super.onResume(); refreshLife("onResume"); // 刷新生命周期的日志信息 } @Override protected void onPause() { // 暂停活动 super.onPause(); refreshLife("onPause"); // 刷新生命周期的日志信息 } @Override protected void onRestart() { // 重启活动 super.onRestart(); refreshLife("onRestart"); // 刷新生命周期的日志信息 } @Override protected void onDestroy() { // 销毁活动 super.onDestroy(); refreshLife("onDestroy"); // 刷新生命周期的日志信息 } @Override protected void onNewIntent(Intent intent) { // 重用已有的活动实例 super.onNewIntent(intent); refreshLife("onNewIntent"); // 刷新生命周期的日志信息 } @Override public void onClick(View v) { if (v.getId() == R.id.btn_act_pre) { finish(); // 结束当前的活动页面 } } }
activity_act_nextXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_act_pre" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="返回上个页面" android:textColor="#000000" android:textSize="17sp" /> <TextView android:id="@+id/tv_life" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
Activity的启动模式
系统给每个正在运行的APP都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息,鉴于栈式一种先进后出,后进先出的数据结构,故而后面入栈的活动总是先出栈。 示意图如下
启动模式launchMode几种属性值如下
standard 标准模式无论何时启动哪个互动,都是重新创建该页面的实例并放入栈顶
singleTop 启动新活动时,判断如果栈顶正好就是该活动的实例,则重用该实例
singleTask 启动新活动时 判断如果栈中存在该活动的实例,则重用该实例
singleInstance 启动新活动时 将该活动的实例放入一个新栈中 原栈的实例列表保持不动
JumpFirstActivity类代码如下
package com.example.chapter04; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class JumpFirstActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jump_first); findViewById(R.id.btn_jump_second).setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_jump_second) { // 创建一个意图对象,准备跳到指定的活动页面 Intent intent = new Intent(this, JumpSecondActivity.class); // 栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 设置启动标志 startActivity(intent); // 跳转到意图对象指定的活动页面 } } }
activity_jump_firstXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_jump_second" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="跳到第二个页面" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
LoginInputActivity类代码如下
package com.example.chapter04; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class LoginInputActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_input); findViewById(R.id.btn_jump_success).setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_jump_success) { // 创建一个意图对象,准备跳到指定的活动页面 Intent intent = new Intent(this, LoginSuccessActivity.class); // 设置启动标志:跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); // 跳转到意图指定的活动页面 } } }
activity_login_inputXML文件代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="这里是登录验证页面,此处省略了用户名和密码等输入框" android:textColor="#000000" android:textSize="17sp" /> <Button android:id="@+id/btn_jump_success" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="跳到登录成功页面" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
创作不易 觉得有帮助请点赞关注收藏