Android学习之路-Activity生命周期和启动模式(8)

一.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;
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统中,Activity有四种启动模式,分别是: 1. Standard模式:默认的启动模式,每次启动Activity都会创建一个新的实例。如果在应用程序中多次启动同一个Activity,就会创建多个Activity实例。它的特点是可以在任何地方启动Activity,不会影响其他Activity生命周期。 2. SingleTop模式:如果要启动Activity在栈顶已经存在,那么不会创建新的实例,而是复用栈顶的Activity,并调用onNewIntent()方法传递参数。如果要启动Activity不在栈顶,那么就会创建新的实例。它的特点是可以避免创建多个实例,但是如果Activity已经存在且不在栈顶,还是会创建新的实例。 3. SingleTask模式:如果要启动Activity在栈中已经存在,那么系统就不会创建新的实例,而是将栈中该Activity上面的所有Activity全部出栈,使该Activity成为栈顶。如果要启动Activity不在栈中,那么就会创建新的实例。它的特点是可以保证一个Activity只有一个实例,并且在栈中只有一个实例。 4. SingleInstance模式:一个独立的栈会为该Activity创建,且该栈中只有该Activity的实例。如果要启动Activity已经存在于独立栈中,那么就会复用该Activity的实例。如果要启动Activity不在独立栈中,那么就会创建新的实例并放入该独立栈中。它的特点是可以保证在整个系统中只有一个实例,并且该实例会独立于其他Activity

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值