Application、进程、Task、Activity理解

本文深入解析 Android 中的进程管理机制、Task 概念、Activity 的四种启动模式及其应用场景,并介绍了 Intent Flag 的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查阅了各种资料,以自己的理解加以整理。

关于进程
一个Application就是一个应用,在应用启动时,android会启动一个linux进程和一个主线程,这个进程以应用的包名命名,在默认的情况下,这个Application下的Activity、service、provider、receiver等组件都在这个进程中运行。在Manifest中。可以这个组件的“android:process”属性来指定这个组件运行在哪个进程。如果某组件process指定的进程名以冒号开头,如:android:process=”:baidumap”,则这个“:baidumap”进程对于这个应用来说是私有的,那么这个进程会被创建;如果
某组件process指定的进程名是以小写字母开头的,如“com.xxx.xxx”,那么这个组件将运行在“com.xxx.xxx”这个全局进程中,实现资源共享。

关于Task
Task在用户的角度看,它相当于一个Activity的栈,用户在按返回时,这个栈就回退,显示前一个Activity。但是实际上,Task并不是一个实际存在的栈,Activity存在ActivityStack中,TaskRecord记录activity属于哪个Task,Task用TaskId来标识。比如,在微信中打开系统相机,微信和相机属于不同应用,用户在相机中按返回怎么回到微信呢?把他们放他一个Task中就可以。

关于Activity的启动模式
Activity的有四种启动模式,分别是standard、singleTop、singleTask、singleInstance。
standard:standard是默认的启动模式,在任何时候都是启动新的activity。比如在A、B、C都是standard模式,启动顺序是A-A-B-A-C-A-A那么在栈中的activity就是A-A-B–C-A-A,用户在按返回时也是依次回退。
singleTop:这种模式允许多个实例,但是不能叠加。比如栈顶的Activity是A,那么再次启动A时,不会创建新的实例,而是调用A的onNewIntent方法。
singleTask:这种模式下,只允许一个实例。在启动Ativity B时,如果该Task中没有这个B,则创建,如果有,这将这个B上面的Activty全部destory,并调用B的OnNewIntent方法。比如Task中Activity是A-B-C-D,在启动B,那么先destory C、D,再调用B的onNewIntent方法。如果在其他应用other中启动B,如果B所在的Task在运行,那么将这个Task带到前台,并将上面的destory调,如果没有,那么会重新创建新的Task。
singleInatance:只有一个实例而且这个实例单独在一个Task中。

关于Intent的Flag
FLAG_ACTIVITY_NEW_TASK:会开启一个新的Task,并创建该Activity置于栈底。如果这个Activity所在的Task已经在运行,那么将这个Task放到前台,并创建这个Activity置于栈顶。
FLAG_ACTIVTY_CLEAR_TOP:如果要启动的Activity B已经在当前task中,那么会将这个B之上的Activity清除掉,重新创建这个B或者调用B的onNewIntent。如果B的启动模式是“standard”,且没有设置“FLAG_ACTIVITY_SINGLE_TOP”会重新创建,其他情况会调用onNewIntent。将FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVTY_CLEAR_TOP结合起来,可以启动一个task的根节点。比如:如果我要启动根节点A,如果A没有启动,那么开启一个新的task,将A置于栈底,如果A已经在Task中,且这个Task中的Activity为:A-B-C,那么首先将给Task放到前台,再将B、C清除掉。
FLAG_ACTIVITY_SINGLE_TOP:如果要启动的Activity再栈顶时,调用onNewIntent,不创建新的Activity。
FLAG_ACTIVITY_CLEAR_WHEN_RESET:可以设置Activity为一个还原点,在再次打开这个应用时,会清除栈中还原点之上的activity。例如一个音乐播放器,用户打开了歌曲列表,又进入了播放界面,你希望用户再次打开时进入歌曲列表,而不是播放界面,就可以把歌曲列表界面设置为还原点,再次打开时,会清除播放界面而直接进入歌曲列表界面。
FLAG_ACTIVITY_FORWORD_RESULT:从一个ActivtyA启动另一个ActivityB,那么可以在B中setResult(int),这个result可以发送到A中。比如:在Activity中启动一个DialogActivity,那么DialogActi处理结果可以返回到Activity中。

主要参考:http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html   
               http://blog.youkuaiyun.com/shinay/article/details/7898492/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值