首页 > 其他分享 >Android 开发之Activity的启动模式-SingleTop

Android 开发之Activity的启动模式-SingleTop

时间:2023-06-22 14:37:58浏览次数:40  
标签:onCreate MainActivity 源码 Activity Android 解析 SingleTop


接下来,介绍下Activity的另一种启动模式- 栈顶复用模式(SingleTop

SingleTop

singleTop模式,它的表现几乎和standard模式一模一样,一个singleTop Activity 的实例可以无限多,唯一的区别是如果在栈顶已经有一个相同类型的Activity实例,Intent不会再创建一个Activity,而是通过onNewIntent()被发送到现有的Activity。
分两种处理情况:须要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。

配置清单文件:

<activity
   android:name=".MainActivity"
   android:label="@string/app_name"
   android:launchMode="singleTop" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
</activity>

简单的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
 <Button
  android:id="@+id/singleTopBtn"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="SecondActivity Button" />
</LinearLayout>

添加onCreate()方法中的代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //打印当前对象
  Log.d("MainActivity", this.toString());
  //去掉title
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  //获取secondBtn
  Button secondBtn = (Button) findViewById(R.id.singleTopBtn);
  //添加点击事件
  secondBtn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
    //为了测试singleTop启动模式,当点击按钮时,启动MainActivity活动
    Intent intent = new Intent(MainActivity.this,MainActivity.class);
    //启动活动
    startActivity(intent);
   }
  });
}

无论点击多少次按钮,都不会有新的日志打印出来。原因是当前栈顶活动为MainActivity,启动模式是singleTop,当发现栈顶为该活动时,就使用当前实例,不在新建实例。因为MainActivity只有一个实例,所以只需按一次Back键就可退出当前活动。

Android 开发之Activity的启动模式-SingleTop_Kotlin

修改onCreate()方法中的代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //打印当前对象
  Log.d("MainActivity", this.toString());
  //去掉title
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  //获取secondBtn
  Button secondBtn = (Button) findViewById(R.id.singleTopBtn);
  //添加点击事件
  secondBtn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View view) {
    //为了测试singleTop启动模式,当点击按钮时,启动SecondActivity活动
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    //启动活动
    startActivity(intent);
   }
  });
}

再SecondActivity的onCreate方法中添加如下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //打印当前对象
  Log.d("SecondActivity", this.toString());
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_second);
  //获取按钮
  Button myButton = (Button)findViewById(R.id.myButton1);
  //点击事件
  myButton.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    //启动MainActivity活动
    Intent intent = new Intent(SecondActivity.this,MainActivity.class);
    startActivity(intent);
   }
  });
}

查看控制台打印的日志:

Android 开发之Activity的启动模式-SingleTop_android studio_02

第一个日志是初次进入MainActivity打印的,点击按钮进入SecondActivity,打印了第二个日志。当点击SecondActivity中的按钮时,此时栈顶活动是SecondActivity,所以当点击按钮时,会创建一个新的MainActivity实例。此时,点击Back退到SecondActivity,再次点击退到MainActivity,再次点击则退出程序。

通过以上的代码可以看出来,SingleTop模式下,基本很standard模式差不多,差别在于,是否是处于栈顶,如果是,则不重新创建,当然也不会走onCreate方法了,如果此时有数据传输,则需要再onNewIntent方法中处理,如果不是则创建新的实例,这种情况下,应用的场景有哪些呢, 当页面跳转会出现不停的跳转到自己当前activity时,可以选择singleTop,singleTop模式解决了系统的栈顶复用问题。

文末

如果你想成为架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

Android 开发之Activity的启动模式-SingleTop_Kotlin_03


相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

一、架构师筑基必备技能

1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……

Android 开发之Activity的启动模式-SingleTop_Android_04

二、Android百大框架源码解析

1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程

Android 开发之Activity的启动模式-SingleTop_Kotlin_05

三、Android性能优化实战解析

  • 腾讯Bugly:对字符串匹配算法的一点理解
  • 爱奇艺:安卓APP崩溃捕获方案——xCrash
  • 字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc
  • 百度APP技术:Android H5首屏优化实践
  • 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  • 携程:从智行 Android 项目看组件化架构实践
  • 网易新闻构建优化:如何让你的构建速度“势如闪电”?

Android 开发之Activity的启动模式-SingleTop_android_06

四、高级kotlin强化实战

1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》

  • 从一个膜拜大神的 Demo 开始
  • Kotlin 写 Gradle 脚本是一种什么体验?
  • Kotlin 编程的三重境界
  • Kotlin 高阶函数
  • Kotlin 泛型
  • Kotlin 扩展
  • Kotlin 委托
  • 协程“不为人知”的调试技巧
  • 图解协程:suspend

Android 开发之Activity的启动模式-SingleTop_Kotlin_07

五、Android高级UI开源框架进阶解密

1.SmartRefreshLayout的使用

2.Android之PullToRefresh控件源码解析

3.Android-PullToRefresh下拉刷新库基本用法

4.LoadSir-高效易用的加载反馈页管理框架

5.Android通用LoadingView加载框架详解

6.MPAndroidChart实现LineChart(折线图)

7.hellocharts-android使用指南

8.SmartTable使用指南

9.开源项目android-uitableview介绍

10.ExcelPanel 使用指南

11.Android开源项目SlidingMenu深切解析

12.MaterialDrawer使用指南

Android 开发之Activity的启动模式-SingleTop_Android_08

六、NDK模块开发

1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习

Android 开发之Activity的启动模式-SingleTop_android studio_09

七、Flutter技术进阶

1、Flutter跨平台开发概述

2、Windows中Flutter开发环境搭建

3、编写你的第一个Flutter APP

4、Flutter开发环境搭建和调试

5、Dart语法篇之基础语法(一)

6、Dart语法篇之集合的使用与源码解析(二)

7、Dart语法篇之集合操作符函数与源码分析(三)


Android 开发之Activity的启动模式-SingleTop_Android_10

八、微信小程序开发

1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……

Android 开发之Activity的启动模式-SingleTop_Kotlin_11

全套视频资料:

一、面试合集

Android 开发之Activity的启动模式-SingleTop_Android_12


二、源码解析合集

Android 开发之Activity的启动模式-SingleTop_Android_13


三、开源框架合集

Android 开发之Activity的启动模式-SingleTop_android_14


标签:onCreate,MainActivity,源码,Activity,Android,解析,SingleTop
From: https://blog.51cto.com/u_16163480/6534851

相关文章

  • Android:克服这些困难,让你直达阿里P7!
    写在前面;Android开发前几年火爆一时,市场饱和后Android程序员每一名程序员都想进阶,甚至成为架构师,但这期间,需要付出的辛苦和努力远超过我们的想象。就我这几年对所接触的Android工程师调研:97%的Android开发技术人都会面临这些困境(可能也是你的困惑)主要困境;**外包公司/小型团队技术......
  • Android:大厂技术面试过不了怎么办?别急!这些知识体系让你的面试稳如泰山!
    前言年年寒冬,年年也挡不住一个安卓程序员追求大厂的决心。想要进入大厂,我们需要掌握哪些知识点呢?这里,我为大家梳理了一个整体的知识架构。整体包括Java、Android、算法、计算机基础等等,相应的知识点的面试题都整理出来了。希望大家阅读之后,能帮助大家完善与整理自己的知识体系。祝......
  • Android-Kotlin-单例模式
    先看一个案例,非单例模式的案例:描述Dog对象:packagecn.kotlin.kotlin_oop08classDog(varname:String,varcolor:String){/***显示狗狗的名字*/funshowDogName(){println("狗狗的名字是:${this.name}")}/***显示狗狗的颜......
  • Android-Kotlin-枚举ENUM
    为什么要用枚举?枚举的好处有:1.使程序更容易编写和维护2.防止用户乱输入,是一种约束来看两个案例案例一星期:星期的枚举:enumclass类名{}packagecn.kotlin.kotlin_oop09/***定义星期的枚举类*/enumclassMyEnumerateWeek{星期一,星期二,星期三,星......
  • Android-Kotlin-函数表达式&String与int转换$异常处理
    Kotlin的函数表达式:packagecn.kotlin.kotlin_base03/***函数第一种写法*/funaddMethod1(number1:Int,number2:Int):Int{returnnumber1+number2}/***函数第二个种写法*/funaddMethod2(number1:Int,number2:Int)=number1+number2/***......
  • Android-kotlin-接口与多态的表现
    上一篇博客介绍了Android-Kotlin-抽象类与多态的表现;而这一篇博客专门介绍下接口与多态的表现1.选择包名,然后右键:2.选择Class类型,会有class:3.选择File类型,不会自动有class:5.选择interface,是创建接口:6.目录结构:1.定义手机充电接口标准规范InterfacePhone:packagecn.kotlin.kot......
  • Android Xml文件生成,Xml数据格式写入
    生成xml文件格式数据,Android提供了Xml.newSerializer();,可以理解为Xml序列化;序列化:把内存里面的数据(file,databases,xml等等)丢给某一个地方; 反序列化:把某个地方的数据(file,databases,xml等等),拿到内存中;既然是Android操作Xml,就用Android所提供的API,不用Java所提供的API,DOM......
  • Android-Kotlin-When&类型推断
    Kotlin的when表达式TextEngine描述文字处理对象:packagecn.kotlin.kotlin_base02/***描述文字处理对象**valtextContent传入进来的文字内容val是常量*/classTextEngine(valtextContent:String){/***处理文字,然后返回*返回完整的字符串......
  • Android-kotlin的继承
    上一篇博客讲了Android-kotlin的配置/入门,然后简单的实现了一个计算器功能。今天我们来讲讲kotlin中的继承是怎样的。1.先看一个案例,子类使用到父类的资源【案例一】父类张翠山:packagecn.kotlin.kotlin_oop03/***描述父对象:张翠山**personDescribe此人的简介/var......
  • Android-kotlin-具名参数
    先看一个这样的案例,【案例一】:packagecn.kotlin.kotlin_base05funshowAction1(country:String,volk:String){println("我的祖国是${country},我的民族是$volk")}funshowAction2(country:String,volk:String){println("我的祖国是${country},我的民族是......