一.Activity跳转示例:
从当前页跳转到下一页
Intent intent = new Intent(); intent.setClass(源页面.this, 目标页面.class); startActivity(intent);
返回上一页(关闭当前页面)
finish();
下面是官方提供Activity生命周期视图:
二、各回调方法解释:
- onCreate 创建活动。把页面布局加载进内存,进入了初始状态
- onStart 开始活动。把活动页面显示在屏幕上,进入了就绪状态
- onResume 恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许用户点击动作、允许输入文字等等(执行动画一般放在此处,比较消耗资源,用户看不到时没必要执行动画)
- onPause 暂停活动。 页面进入暂停状态,无法与用户正常交互(一般在此处暂停动画)
- onStop 停止活动。页面将不再屏幕上显示
- onDestroy 销毁活动。回收活动占用的系统资源,把页面从内存中清除(释放对象,取消监听)
- onRestart 重启活动。重新加载内存中的页面数据。
- onNewIntent 重用已有的活动实例
各状态间的切换 过程:
打开新的页面方法调用顺序为:
onCreate->onStart->onResume
关闭旧页面的方法调用顺序为:
onPause->onStop->onDestroy
A页面出现:
ActStartActivity onCreate
ActStartActivity onStart
ActStartActivity onResume
A跳转到B下个页面:
ActStartActivity onPause
ActFinishActivity onStart
ActFinishActivity onResume
ActStartActivity onStop
返回上个页面:
ActFinishActivity onPause
ActStartActivity onRestart
ActStartActivity onStart
ActStartActivity onResume
ActFinishActivity onStop
ActFinishActivity onDestroy
点击home键到后台:
ActFinishActivity onPause
ActFinishActivity onStop
从后台到前台:
ActFinishActivity onRestart
ActFinishActivity onStart
ActFinishActivity onResume
上面生命周期函数调用顺序建议自己多动手调试几次。
三、Activity的启动模式:
Task Stack采用栈的形式管理Activity,先进后出
3.1、默认启动模式standard
在manifest文件设置,默认是standard模式,在该模式下启动Activity会依照启动顺序依次压入Task 栈中:
3.2、栈顶复用模式singleTop
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity
应用场景
适合开启渠道多、多应用开启调用的Activity,通过这种设置可以避免已经创建的Activity被重复创建,多数通过动态设置使用。
3.3、栈内复用模式singleTask
与singleTop相似,只不过singleTop模式只是针对栈顶元素,而singleTask模式下,如果task栈内存在目标Activity实例,则将task内对应的Activity实例之上的所有Activity弹出栈,并将对应的Activity置于栈顶获得焦点。
应用场景
程序主界面:我们肯定不希望主界面被创建多次,而且在主界面退出的时候退出整个APP是最好的效果
耗费系统资源的Activity:对于那些极其耗费系统资源的Activity我们可以考虑这种模式以减少资源耗费
3.4、全局唯一模式 singleInstance
在该模式下,会为目标Activity创建一个新的task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的task有且只有这一个Activity实例。如果已经创建过目标Activity则不会创建新的task,而是将以前创建的Activity唤醒。
在Java代码中动态的设置启动模式:
五、启动模式的具体使用
5.1、解决两页面相互重复多次跳转问题
Intent intent = new Intent();
intent.setClass(JumpFirstActivity.this, JumpSecondActivity.class);
// 当栈中存在待跳转的活动实例时,则重新创建该活动实例,并清除原实例上方的所有实例
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//设置启动标志
startActivity(intent);
5.2、登录成功之后不再返回登录页面
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(LoginInputActivity.this, LoginSuccessActivity.class);
// 跳转到新页面时,栈中的原有实例被全部清空,同时开辟新任务的活动栈
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
六、Intent的组成部分
Intent是各个组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:
标明本次通信请求从哪里来、到哪里去、要怎么走
发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据
发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容
3.1、显式 Intent,直接指定来源活动与目标活动,属于精确匹配。它有三种构建方式:
- 在Intent的构造函数中指定
Intent intent = new Intent(LoginInputActivity.this, LoginSuccessActivity.class);
- 调用意图对象的setClass方法指定
Intent intent = new Intent(); intent.setClass(LoginInputActivity.this, LoginSuccessActivity.class);
- 调用意图对象的setComponent方法指定
ComponentName componentName = new ComponentName(this,LoginSuccessActivity.class); //传入包名或者类名,与前两种相比不需要知道Class类本身,当想调用支付宝的相关类只需要填写包名和类名就可以 //ComponentName componentName = new ComponentName(pkg:"包名", cls:"类名"); intent.setComponent(componentName);
3.2、隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
通常App不希望向外部暴露活动名称,只给出一个事先定义好的标记串,这样大家约定俗成按图索骥就好,隐式Intent便起到了标记过滤作用。这个动作名称标记串可以是自己定义的动作,也可以是已有的系统动作。常见的系统动作取值说明见下表:
动作名称既可以通过setAction方法指定,也可以通过构造函数Intent(String action)直接生成意图对象
//动作名称既可以通过setAction方法指定,也可以通过构造函数Intent(String action)直接生
成意图对象
String phoneNum = "10086";
Intent intent = new Intent(); // 创建一个新意图
intent.setAction(Intent.ACTION_DIAL);// 设置意图动作准备拨号
Uri uri = Uri.parse("tel:" + phoneNum);// 声明一个拨号Uri
intent.setData(uri); // 设置意图前往路径
startActivity(intent); // 启动意图通往的活动页面
隐式Intent还用到了过滤器的概念,把不符合匹配条件的过滤掉,剩下符合条件的按照优先顺序调用。譬如创建一个APP模块
AndroidManifest.xml文件里的intent-filter就是配置文件中的过滤器。像最常见的首页活动MainActivity它的activity节点下面便设置了action和category的过滤条件。其中android.intent.action.MAIN表示APP的入口动作,而android.intent.category.LAUNCHER表示在桌面上显示图标配置样例如下:
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="standard"
tools:ignore="DuplicateActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
四、调起系统应用拨打电话、发短信、调起另一个应用
@Override
public void onClick(View v) {
Intent intent = new Intent();
String phoneNo = "12345";
switch (v.getId()) {
case R.id.btn_dial:
// 设置意图动作为准备拨号
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:" + phoneNo);
intent.setData(uri);
startActivity(intent);
break;
case R.id.btn_sms:
// 设置意图动作为准备发短信
intent.setAction(Intent.ACTION_SENDTO);
Uri uri2 = Uri.parse("smsto:" + phoneNo);
intent.setData(uri2);
startActivity(intent);
break;
default:
intent.setAction("android.intent.action.guo");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
break;
}
}