Activity解析

【源码解析】Activity 启动模式Launch Mode机制 Activity启动模式源码解析 启动模式常见应用场景 一般情况下启动activity的时候不需要指定launchMode,不指定launchMode时,使用的时默认值,默认值时standard。standard属性在运行时会被解析成FLAG_ACTIVITY_MULTIPLE_TASK,因而源码中就是用这个flag来处理standard类型的。 如果需要指定launchMode,则... 阅读详情

这篇文章会涉及到以下几个内容:

  一 Activity的生命周期
  二 让Activity变成一个窗口:Activity属性设定
  三 你后台的Activity被系统 回收怎么办:onSaveInstanceState
  四 调用与被调用:我们的通信使者 - Intent

 

一 Activity的生命周期


     和其他手机平台的应用程序 一样,Android应用程序的生命周期是被统一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习 并适应它。简单地说一下为什么是这样:我们手机在运行一个应用程序的时候,有可能打进来电话发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,另外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。所以,应用程序的生命周期是不会由我们自己控制的。言归正传,Activity的基本生命周期如下代码 所示: 
  

    你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume(ps:resume是重新开始的意思), 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断  这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。

   详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

   onCreate:   在这里创建界面 ,做一些数据 的初始化工作

   onStart:    到这一步变成用户可见不可交互 的

   onResume:   变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个      
                      Activity的最上面,运行完弹出栈,则回到上一个Activity)

   onPause:     到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情
                    从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
                    你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在

                    onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
                    个activity不会等到这个方法完成才启动

   onstop:     变得不可见 ,被下一个activity覆盖了

   onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
                     法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
                     断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
                     把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
                     异常的。

   而midlet只有startApp(),pauseApp(),destroyApp()。另外,onPause,onstop, onDestroy,三种状态下activity都有可能被系统干掉。为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。

 

二 让Activity变成一个窗口:Activity属性设定     


   讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很简单你只需要设置一下Activity的主题就可以了在AndroidManifest.xml 中定义Activity的
地方加一句话:


Xml代码


android :theme="@android:style/Theme.Dialog"

android:theme="@android:style/Theme.Dialog"


这就使你的应用程序变成对话框的形式弹出来了,或者


Xml代码


android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable

上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。


三 你后台的Activity被系统回收怎么办:onSaveInstanceState
  
   当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行

Java代码


public
void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    outState.putLong("id", 1234567890);  
}  


B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了(ps:这里结合生命周期方法理解)。

savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

Java代码


if(savedInstanceState != null){  
     long id = savedInstanceState.getLong("id");  
}  


就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...

 

四 调用与被调用:我们的通信使者Intent

 

要说Intent了,Intent就是意图 ,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:

Java代码


Intent intent = new Intent();  
intent.setAction(Intent.ACTION_CALL);  
intent.setData(Uri.parse("tel:" + number));  
startActivity(intent);  

扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计 确实很好。

那Intent通过什么来告诉系统需要谁来接受他呢?通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:

Java代码


Intent intent = new Intent(this, MyActivity.class);  
intent.getExtras().putString("id", "1");  
tartActivity(intent);  


第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。

第二种就需要先看一下AndroidMenifest中的intentfilter的配置了

Xml代码


<intent-filter>
    <action
android:name="android.intent.action.VIEW"
/>
    <action
android:value="android.intent.action.EDIT"
/>
    <action
android:value="android.intent.action.PICK"
/>
    <category
android:name="android.intent.category.DEFAULT"
/>
    <data
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
</intent-filter>
这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?

action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才能让数据被别人使用。

不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。

想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent



补充:

在activity  finish时候,这时候handler.sendMessage,这时候也会导致bug

这时候最好在finish函数里面removeAllCallbackAndMessage(this)


Android Activity 源码解析与启动流程 本文通过分析 Activity 的源码和启动流程,详细介绍了 Activity 类的结构和生命周期方法,并解释了 startActivity() 方法的原理和 startActivityForResult() 方法的用法。为了深入理解 Activity 的工作原理,我们将分析 Activity 的源码,并详细说明 Activity 的启动流程。当我们调用 startActivity() 方法启动一个新的 Activity 时,系统会按照一定的流程完成 Activity 的创建和启动。 阅读详情

相关推荐

AXI4协议之AXI4-Lite接口详解及实战

本文首先对AXI4总线协议进行了一个简单的介绍,然后使用vivado提供的模板创建了一个AXI4-Lite Master的接口,并生成了一个具有Master和Slave的代码实例,阅读该示例代码,进行修改后用于自己的项目。

高阶近似的博客 2万+

activity 典型生命周期

抄录部分 安卓生命周期如下: onCreate : 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。 onStart : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在...

定格空间 362

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4731

Activity详解

Activity的生命周期 生命周期方法 方法名称 方法作用 onCreate 表示Activity已经被创建,一般在这个方法中做一些初始化的工作,比如调用setContentView去加载布局资源或者初始化Activity所需的数据。 onStart 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互。 onResume 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互 onPause .

qq_42418169的博客 1万+

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5070

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

data+scenario+science+insight 3926

Android之Activity的四种启动模式

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。 1. Standared模式(默认) 我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activi

a623891391的专栏 1023

高通Camx功能feature分析之二:remosaic流程

本文介绍了Remosaic技术及其在图像处理中的应用。Remosaic是将4cell1像素排布还原为普通Bayer结构的过程,分为硬件和软件两种实现方式。文章详细解析了Remosaic流程,包括配流情况、Feature选择、初始化过程,以及触发拍照的完整流程。重点分析了从普通预览切换到全尺寸拍照的关键步骤:激活全尺寸RDI会话、生成请求、等待就绪、唤醒离线线程和重启预览。通过代码层面的分析,揭示了Remosaic技术如何实现高分辨率图像还原,同时说明了该过程中可能出现的预览定屏现象及其原因。

1879

Activity的全方位解析

s

深红骑士的博客 688

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

UG二次开发之 三面摆正体代码分析

CIUGUIBlock 是一个从UIBlock 派生的一个类,为什么要从UIBlock 派生出CIUGUIBlock,这是为了兼容低版的UG。如果我们不从的UIBlock 派生控件类对象指针,在UG 8.5以下的版本,会出现编译错误的问题。这是一个简单的入门功能,包括了不少的常用的UF函,下面我们将结合成品代码一起分析一下常用的函数,这对初学者是必要的。根据创建好的UI控件,在 initialize_cb 中创建控件的指针对象。//根据选定的面,指定 X,Y坐标系轴。//根据变换的矩阵,平移实体。

u014657217的博客 350

【源码解析】Activity的启动过程

在平时启动Activity时,我们常用的是在Activity中直接调用startActivity(intent)就可以启动Activity,或者是通过context来启动Activity。归根结底调用的是ContextImpl类的startActivity(intent)方法。所以我们直接从ContextImpl的startActivity(intent)方法开始,而startActivity(i...

Running&H的博客 312

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 906

【Android】源码解析Activity的结构分析

简单介绍了Activity的结构,以及Activity,Window,View之间的管理。

摸鱼小小虫的博客 2207

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

解析XML并显示到Activity中

要解析XML并在Activity中显示,你可以使用Android提供的XML解析器来完成。这样,解析后的XML数据就会显示在对应的TextView中。记得根据你的实际情况进行适当的布局和UI调整。的字符串资源,该资源包含了要解析的XML内容。确保在XML解析之前在资源文件中定义了正确的XML内容。请注意,上述示例代码假设你在。

斯黄人民的博客 520

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android activity 按钮,Android之Activity全面解析

前言基于最近要准备去面试,特意系统的复习了下Android基础,看到Activity这块时,发现很多都忘了,而且之前也没有系统的学习和写笔记记录,所以,特此写下这篇关于Activity的一些理解,旨在帮助大家更好的理解Activity.Activity是什么?Activity是一个Android应用程序组件(也称为Android四大组件之一),它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些...

weixin_36403165的博客 479

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Activity全面解析

Activity是Android的四大组件之一,它的使用频率是最高的,因此想要了解android开发,那么必须要了解Activity。 Activity的生命周期全面解析 一、典型情况下的生命周期 正常情况下,Activity会经历如下声明周期。 onCreate():Activity的第一个生命周期,主要是通过setContentView()加载布局。 onStart():表示

zhangxun_1900的博客 798

Android之Activity全面解析

前言 基于最近要准备去面试,特意系统的复习了下Android基础,看到Activity这块时,发现很多都忘了,而且之前也没有系统的学习和写笔记记录,所以,特此写下这篇关于Activity的一些理解,旨在帮助大家更好的理解Activity. Activity是什么? Activity是一个Android应用程序组件(也称为Android四大组件之一),它提供了一个屏幕,用户可以通过该屏幕进行交互...

Darry_R的博客 629

android中activity类的作用,Android Activity全面解析

从实习到现在,工作了也快一年了,期间过程也碰到和解决了不少的问题,我的为知笔记上也积累了许许多多零零散散的知识点。个人觉得还是有必要将这些零碎的知识点整体梳理总结一遍这样才能真正的转化成真正的技术积累。所以这个专题我主要就是对Android的一些常用知识点以及开发当中遇到的各种问题进行一些梳理与总结。首先,就从Android四大组件Activity开始。1.Activity生命周期方法完全解析ac...

weixin_39600447的博客 1084

Activity与intent解析

1.先从看的见的入手(Toast与Menu) Toast是一种android中一种非常好的提醒方式,它可以将一些短小的信息通知给用户,一段时间后自动消失,不会占用任何的屏幕空间。 Menu则可以大幅度帮我们节省屏幕空间,将菜单收缩。 具体实现 我们先在res目录下新建menu文件夹:右击res目录-New-Directory 再再menu文件夹下新建main菜单文件:右击menu文件夹-New-M...

weixin_43312313的博客 762

Activity启动过程全解析

【凯子哥带你学Framework】Activity启动过程全解析

rabbit_in_android的博客 394

Activity的启动流程源码解析

执行了performResume()后接着进行执行将DecorView添加到Window中,在添加完DecorView之后创建ViewRootImpl(),在这个类中执行performTraversals()在这个方法里面会执行performMeasure(),performLayout(),performDraw(),对于view进行绘制,摆放,绘制流程。Activity中的onResume()是通过调用ActivityThread().handleResumeActivity()来执行的,

clzolo的博客 415

Android之Activity全方位解析

一、Activity的生命周期 1、典型的生命周期 在这张图中,总共7种状态: onCreate()与onDestroy()对应,存在状态 onStart()与onStop()对应,可见状态 onResume()与onPause()对应,前台状态,即可以进行点击操作等 而对于onRestart(),其执行具体过程:onStop() -> onRestart() -> o...

weixin_45365889的博客 907
上一篇: 删除svn信息
下一篇: AndroidManifest.xml分析
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值