android Activity介绍
一般情况下,Android程序的流程都运行在activity中,activity具有自己的生命周期,由系统来控制。可以使用onSaveInstanceState()和onRestoreInstanceState()方法来保存和恢复状态。activity之间通过Intent来进行跳转和数据传输。
Activity的生命周期如图所示:
由上图可知Activity生命周期有三个关键的循环:
1、整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。
Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
2、可见的生命周期,从onStart()开始到onStop()结束。
在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart()中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
3、前台的生命周期,从onResume()开始到onPause()结束。
在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
常见的生命周期过程:
1、启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2、当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3、当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4、当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5、用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6、当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate()、onStart()、onResume(),进入运行状态。
7、用户退出当前Activity:系统先调用onPause(),然后调用onStop(),最后调用onDestory(),结束当前Activity。
Activity生命周期中涉及到的函数如下:
protected void onCreate(Bundle savedInstanceState):Activity被创建时调用
protected void onStart():Activity被创建或者从后台回到前台时调用
protected void onRestart():Activity从后台回到前台时调用
protected void onResume():Activity创建或者或者从被覆盖、后台重新回到前台时调用
protected void onPause():Activity被覆盖或者锁屏时被调用
protected void onStop():Activity跳转到新的Activity或者退出时调用
protected void onDestroy():Activity退出时调用
Activity用来保存和恢复状态的方法如下:
protected void onSaveInstanceState(Bundle outState)
Activity被系统杀死时调用,如屏幕横竖屏切换Activity被销毁再重建等。
(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;
(2)在用户改变屏幕方向时,此方法会被调用;
(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。
第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之前。
protected void onRestoreInstanceState(Bundle savedInstanceState)
Activity被系统杀死后重新创建时调用,如屏幕横竖屏切换Activity被销毁再重建等。
(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;
(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。
我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。
public void onWindowFocusChanged(boolean hasFocus)
Activity窗口获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。
透明主题从一个activity A跳转到另外一个activity B:
A:onPause()
注意不会调用onStop()方法,因此activity B finish()之后activity A不会调用onRestart()方法。
从activity B返回activity A
A:onResume()
设置activity主题透明:
示例代码如下
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="ThemeActivity" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="WXTheme" parent="AppBaseTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
解决方法:
activity跳转返回修改状态可使用onActivityResult()方法。
Activity全屏设置
方式1:AndroidManifest.xml
<activity android:name="MainActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
方式2:代码实现
requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); // 隐藏状态栏
注意:设置全屏的代码必须在setContentView(R.layout.main) 之前,不然会报错。
Activity横竖屏设置
方式1:AndroidManifest.xml
<activity android:name="MainActivity" android:screenOrientation="landscape" /> // 或者 “portrait”
方式2:代码实现
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
获取横屏方向
int orientation = this.getResources().getConfiguration().orientation;
orientation 的常用取值可以为 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE(横屏) 或 ActivityInfo.SCREEN_ORIENTATION_PORTRAIT(竖屏)
Activity屏幕一直显示
1、AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
2、代码实现
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Activity启动过程
可将其分为6个过程
1、使用代理模式启动到ActivityManagerService中执行。
2、创建ActivityRecord到mHistory记录中。
3、通过socket通信到Zygote相关类创建process。
4、通过ApplicaitonThread与ActivityManagerService建立通信。
5、ActivityManagerService通知ActivityThread启动Activity的创建。
6、ActivityThread创建Activity加入到mActivities中并开始调度Activity执行。
Activity主要包括以下属性:
taskAffinity
launchMode,启动模式
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
taskAffinity属性
默认情况下,一个应用程序中的所有activity都有一个affinity,它们属于同一个Task。
每个activity可以通过<activity>中的taskAffinity属性设置单独的affinity。
1、不同应用程序中的activity可以共享同一个affinity。
2、同一个应用程序中的不同activity也可以设置成不同的affinity。
affinity属性在2种情况下起作用:
1、启动activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记。
2、启动activity的allowTaskReparenting被设置成true。
主要的Intent标记如下:
FLAG_ACTIVITY_NEW_TASK:如果启动activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建启动activity的affinity属性
的Task,并将启动activity压入新建的Task栈中,否则将启动activity压入affinity属性相同的Task中。
FLAG_ACTIVITY_CLEAR_TOP:
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
FLAG_ACTIVITY_SINGLE_TOP:
Activity启动模式launchMode属性有四种值:
standard、singleTop、singleTask和singleInstance。
standard:默认模式,可省略。在这种启动模式下,都会默认创建一个新的实例。因此,这种模式允许多个重复Activity叠加。
singleTop:这种模式允许有多个实例,但不允许多个重复Activity叠加。如果Activity位于栈顶,不会创建新的实例,而会调用onNewIntent()方法。
singleTask:这种模式只有一个实例。在同一应用程序中启动时,若Activity不存在则在当前Task创建一个新的实例,若Activity存在则将Task中在其之上的其它Activity销毁,并调用此Activity的onNewIntent()方法。
singleInstance:这种模式只有一个实例,并且该实例独立运行在一个Task中。这个Task只有该实例,不允许其它Activity存在。
allowTaskReparenting属性
该属性设置为true,则启动activity可以从一个Task移动另一个相同affinity的Task中。
clearTaskOnLaunch属性
如果栈底activity的这个属性被设置为true,一旦用户离开task,则task栈中的activity将被清空到只剩下栈底activity。这种情况与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态,即只剩下栈底acitivty。
alwaysRetainTaskState属性
如果栈底activity的这个属性被设置为true,则Task中的所有activity将被长时间保存。
finishOnTaskLaunch属性
这个属性与clearTaskOnLaunch相似,但它只对单独的activity操作,而不是整个task。它可以结束任何activity,包括栈底的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它将不存在。
android Activity介绍的更多相关文章
- android Animation介绍
Animation介绍: 在Android SDK介绍了2种Animation模式: 1. Tween Animation:间动画,通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果,即 ...
- Android Activity和Fragment的转场动画
Android Activity和Fragment的转场动画 Activity转场动画 Activity的转场动画是通过overridePendingTransition(int enterAnim, ...
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
1.Activity生命周期 接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...
- android AsyncTask介绍(转)
android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ...
- Android monkey介绍
Android monkey介绍 原文地址 1 简略 monkey是android下自动化测试比较重要的的一个工具,该工具可以运行在host端或者设备(模拟器或真实设备).它会向系统发送随机事件流(即 ...
- [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍
注:为了看上去比较清晰这里只转载了中文 原地址: [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...
- android动画介绍--Animation 实现loading动画效果
Animation的使用方法并不难.这里简单的介绍一下使用方法. 先看效果图: 效果还是不错的吧. 下面来看看使用方法. 动画效果是通过Animation来实现的,一共有四种,分别为: AlphaAn ...
- Android Activity全面解析
Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析 activity_lifecycle.png 1).on ...
- [转]Android Activity和Fragment的转场动画
Android Activity和Fragment的转场动画 Activity转场动画 Activity的转场动画是通过overridePendingTransition(int enterAnim, ...
随机推荐
- Linux.NET实战手记—自己动手改泥鳅(下)
在上回合中,我们不痛不痒的把小泥鳅的数据库从只能供在Windows下运行的Access数据库改为支持跨平台的MYSQL数据库,毫无营养的修改,本回合中,我们将把我们修改后得来的项目往Linux中部署. ...
- 完成C++不能做到的事 - Visitor模式
拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩 ...
- 【css3笔记】---- 渐变的秘密
<CSS揭秘>这本书非常不错,充满了干货和惊喜.以下主要是关于使用渐变做出来的一些效果的笔记.请用最新的现代浏览器观看. 首先要回顾下一个css语句: linear-gradient([ ...
- Android开发学习之路-插件安装、检查应用是否安装解决方案
使用Bmob的时候,如果需要用到支付功能,就需要让应用去安装一个支付插件.而一般的做法是将插件放置在assets目录中,当用户需要支付,先检查是否能支付,不能的话,提示安装插件.代码: public ...
- 自建Ngrok服务与使用方法
ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放.可以被使用来进行微信借口的本地调试.在ng ...
- ASP.NET 5 - $.ajax post JSON.stringify(para) is null
JavaScript 代码: var para = {}; para.id = $("#ad-text-id").val(); para.title = $("#ad-t ...
- Oracle数据加载之sqlldr工具的介绍
环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 客户端:WIN10 + Oracle 11.2.0.1 client 目录: sqlldr语法 sqlldr实验准备 sqlldr常 ...
- WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格
通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...
- ASP.NET Core 静态文件及JS包管理器(npm, Bower)的使用
在 ASP.NET Core 中添加静态文件 虽然ASP.NET主要大都做着后端的事情,但前端的一些静态文件也是很重要的.在ASP.NET Core中要启用静态文件,需要Microsoft.AspNe ...