activity启动模式

扒扒Task与Activity启动模式

走远了吗. 提交于 2019-12-15 08:42:25
最近在重新整理Activity的启动模式,顺便也扒了扒任务栈Task,接着又去了解了下Android的概览屏幕,把页面间的跳转、任务栈存放与管理及从任务列表窗口恢复,整体串通的了解了一下。下面有几个基本的问题,你不妨测试一下,看看能掌握多少? 发自灵魂的拷问 设置启动模式为singleTask,若栈内已有该实例,是否栈内就一定是复用的,不会创建实例? 若Intent设置FLAG_ACTIVITY_NEW_TASK,任何启动模式,如果采取startActivityForResult()启动Activity,onActivityResult()有何变化? LauncherActivity->A(standard)->B(singleInstance)按下home键,点击桌面app图标,会发生什么? LauncherActivity->A(standard)->B(standard)->C(singleInstance)->A,按下返回键,会发生什么? 当调用startActivityForResult启动Activity,那么启动模式会发生什么变化? 下面我就带着大家一块测试和分析一下,本篇博客测试设备Pixel(API19)、小米(API21)和OPPO(API27),主要是把android系统5.0作为一个分水岭来测试,因为官方的文档很多地方未交代清楚,需要考证。 ##

Android 学习笔记核心篇

隐身守侯 提交于 2019-12-14 05:03:33
原文:https://juejin.im/post/5c46db4ae51d4503834d8227 Android 学习笔记核心篇 基础知识 底层原理 Android 操作系统是一个多用户 Linux 操作系统,每个应用都是一个用户 操作系统一般会给每个应用分配一个唯一的 Linux 用户 ID,这个 ID 对应用是不可见的。但有些情况下两个应用可以共享同一个 Linux 用户 ID,此时他们可以访问彼此的文件,甚至还可以运行在同一个 Linux 进程中,共享同一个虚拟机。但两个应用的签名必须是一样的 每个进程都有自己的虚拟机,一般每个应用都运行在自己的 Linux 进程中 应用组件 应用没有唯一的入口,没有 main() 函数,因为应用是由多个组件拼凑在一起的,每个组件都是系统或者用户进入应用的入口,组件之间既可以是相互独立的,也可以是相互依赖的。系统和其它应用在被允许的情况下可以启动/激活一个应用的任意一个组件 组件有四种类型: Activity,Service,BroadcastReceiver 和 ContentProvider Activity Activity 表示一个新的用户界面,只能由系统进行创建和销毁,应用只能监听到一些生命周期回调,这些回调通常也被叫作生命周期方法 Activity 的名字一旦确定好就不要再更改了,否则可能会引发一系列问题 Service

遇到Android onActivityResult()不执行的问题

风流意气都作罢 提交于 2019-12-10 07:39:19
以前在使用startActivityForResult()的时候,一直都非常顺利,今天却发现出现了一个奇怪的情况。 问题描述如下: 1、我在执行完startActivityForResult()函数后,还没有启动目标Activity,当前activity中的onActivityResult()方法却先执行了。 2、我在执行完目标Activity,返回的时候,却发现onActivityResult()方法不执行。 就那么几行代码,找了好久没有找到原因。经过搜索一番,发现问题出在Activity的launchMode上。经过测试发现原来在调用startActivityForResult的时候,目标Activity的启动模式只能是launchMode="standard" 和 “singleTop”模式,不能是其他2种模式。 去查看android文档,发现有如下描述: Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN or ACTION_VIEW ), you may not get the result when you expect. For

Android开发小札(一)

二次信任 提交于 2019-12-10 02:20:11
这个小札记主要记录了开发中遇到的问题和解决方案,还有一些源码技巧。 • ImageView方法setImageUri导致OOM 获取到本地图片的Uri以后直接通过setImageUri导致了OutOfMemoryError 分析: 使用setImageUri是直接对uri对应的图片进行加载的,如果图片过大,就会造成OOM 解决: 使用Glide加载,或者对图片进行压缩处理后再设置 • 一个HashCode的生成方法 public class Actor { private final int id ; private final String name ; private final int rating ; private final int yearOfBirth ; public Actor ( int id , String name , int rating , int yearOfBirth ) { this . id = id ; this . name = name ; this . rating = rating ; this . yearOfBirth = yearOfBirth ; } // getter @Override public boolean equals ( Object o ) { if ( this == o ) return true ;

Android组件体系之Activity启动模式解析

泄露秘密 提交于 2019-12-07 20:37:28
本文主要分析Activity的启动模式及使用场景。 一、Activity启动模式浅析 1、standard 标准模式,系统默认的启动模式。在启动Activity时,系统总是创建一个新的Activity实例。其缺点是:复用性差、占用内存,当Activity已经在栈顶时,还是会创建实例。 2、singleTop 这种模式可以实现栈顶复用的效果。 如果目标Activity已经存在于栈顶,则调用实例的 onNewIntent,否则创建一个新的实例,可以用于通知启动的内容显示,例如新闻客户端的内容页面。信息类应用的列表Activity往往也会使用这种启动模式,例如,收到新短信时,如果信息列表Activity已经在栈顶了,则直接调用其onNewIntent,而不需要创建新的Activity。 该模式下,当Activity不在栈顶时,还是会创建新的实例。例如A、B、C三个Activity处于一个任务栈中,且C在栈顶,如果C启动A,则会创建一个新的实例并置于栈顶,使得当前任务栈有两个A实例。 3、singleTask 该模式实现栈内复用的效果。如果栈内已经有目标Activity实例,则清除目标Activity上面的所有Activity、使得目标Activity直接放到栈顶,并调用目标Activity的onNewIntent方法;否则创建一个新的Activity实例。 补充

android:Activity实例的概念及生命周期

别说谁变了你拦得住时间么 提交于 2019-12-06 04:14:54
前言:不同于C编程是通过main函数来启动一个程序,在安卓系统中是通过使用Activity启动程序;在了解Activity的使用之前,首先要了解一下关于Activity的一些概念。   Activity具有生命周期,通过调用系统中的回调方法来创建和管理自己的生命周期状态;Activity通过生命周期来管理自己;   在生命周期中Activity会被实例化,Activity实例是安卓app的关键组件之一;   Activity实例启动之后会被集中放在任务栈中进行管理,Activity的启动模式会影响到任务栈的管理方式;   所有Activity在使用之前需要现在manifest.xml中声明,一般创建Activity的时候会自动声明; <manifest > <application> <activity android:name=".OneActivity" /> <activity android:name=".TwoActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> <

Android开发 如何最优的在Activity里释放资源

冷暖自知 提交于 2019-12-06 02:49:41
前言   当前你已经入门Android开发,开始关注深入的问题,你就会碰到一个Android开发阶段经常碰到的问题,那就是 内存泄漏 . 其实大多数Android的内存泄漏都是因为activity里的资源释放不正确导致,activity与单例或者接口互相持有无法释放.这篇博客就来讲解如何在Android里最优的释放资源. 错误释放资源的一些例子   在看正面例子之前,我们看看反面例子,了解为什么经常莫名其妙的内存泄露 在Activity的onDestroy()的生命周期里释放资源 在下面的 onDestroy ()方法里我们有一个叫 mHttpList 的资源要释放,我们都知道activity的生命周期的最后是 onDestroy 方法,那么为什么在 onDestroy() 里释放资源会有问题呢?    问题出在 onDestroy() 生命周期 并不是立即执行的 .Activity退出前台后先是进入栈里的.是否执行 onDestroy() 是交给系统决定的,一般情况下系统的确会及时的运行 onDestroy() 方法销毁activity,但是在一些Activity跳转频繁的情况下可能系统并不会马上运行 onDestroy() 方法.这个时候问题就出现了你认为应该结束的资源并没有马上结束可能导致一些回调报错或者内存泄露.   @Override protected void

Android组件内核之Activity调用栈分析(一)

那年仲夏 提交于 2019-12-06 00:16:14
阿里P7Android高级架构进阶视频免费学习请点击: https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础。 主要内容 Activity简介 Android任务栈简介 AndroidMainifest启动模式 Intent Flag启动模式 清空任务栈 Activity任务栈使用 具体内容 Activity简介 Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期。 起源 Activity是用户交互的第一接口,他提供了一个用户完成指令的窗口,当开发者创建Activity之后,通过调用setContentView来指定一个窗口界面,并以此为基础,提供给用户交互的接口,系统采用Activity栈的方式来管理Activity。 Activity形态 Activity一个最大的特点就是拥有多种形态,他可以在多种形态中自由切换,以此来控制自己的生命周期。 Activity/Running:这个时候,Activity处于Activity栈的最顶层,可见,并与用户进行交互。 Paused:Activity失去焦点

Android Application的作用

被刻印的时光 ゝ 提交于 2019-12-05 21:00:44
学习android挺长时间了,但是对于Appliction还不是很了解。今天花一些时间研究了一下Application。 What is Application Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。 android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。 Data passing between components using

android 开发积累-activity的launch mode

☆樱花仙子☆ 提交于 2019-12-05 04:47:35
合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》 今天在社区看到有朋友问“如何在半年内成为顶级架构师”,有网友道“关灯睡觉,不用半年的...”,的确,做梦还来的快一些。作为一个程序员,树立远大的目标是值得欣赏的,但不能只去空想,要一步一步地实践才行。成大事者,须从小事做起;万事起于忽微,量变引起质变。 我们今天要讲的是Activity的四种launchMode。 launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的 Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个 task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。 Activity一共有以下四种launchMode: 1.standard 2.singleTop 3.singleTask 4.singleInstance 我们可以在AndroidManifest.xml配置<activity>的android:launchMode属性为以上四种之一即可。 下面我们结合实例一一介绍这四种lanchMode: 1.standard standard模式是默认的启动模式,不用为<activity>配置android