android Activity介绍

摘要:
一般情况下,Android程序的流程都运行在activity中,activity具有自己的生命周期,由系统来控制。在这段时间里,该Activity处于所有Activity的最前面,和用户进行交互。常见的生命周期过程:1、启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。protectedvoidonRestoreInstanceStateActivity被系统杀死后重新创建时调用,如屏幕横竖屏切换Activity被销毁再重建等。

一般情况下,Android程序的流程都运行在activity中,activity具有自己的生命周期,由系统来控制。可以使用onSaveInstanceState()和onRestoreInstanceState()方法来保存和恢复状态。activity之间通过Intent来进行跳转和数据传输。

Activity的生命周期如图所示:

android Activity介绍第1张

由上图可知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主题透明:

示例代码如下

<stylename="AppTheme" parent="AppBaseTheme">

<item name="android:windowIsTranslucent">true</item>

</style>


<stylename="ThemeActivity" parent="@android:style/Theme.Light.NoTitleBar">

<item name="android:windowIsTranslucent">true</item>

</style>


<stylename="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介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇functional仿函数(函数对象),std::bind,std::invoke创建一个简单的VTK程序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Activity 的 36 个问题,你还记得几个?(转)

作者:_yuanhao 链接: https://www.jianshu.com/p/86c0a4afd28e 本文由作者授权发布。 文章包含图片很多,已经尽力让图片尽可能可以看清了,但是无奈手机屏幕太小,仍有一些模糊~ 0前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Acti...

Android实现程序前后台切换效果

太久没动这一块了。借助了下面的文章得到了类似QQ的效果 ,是比较复杂的TABHOST的处理~有需要的Q我。 转了下面的文章: ================ 本文演示如何在Android中实现程序前后台切换效果。    在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。   我们都知道,一个Activity...

Sqlite-Sqlite3中的数据类型

大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。 Sqlite使用一个更一般的动态类型系统,sqlite中,值的数据类型跟值本身相关,而不是与它的容器相关。Sqlite的动态类型系统和其他数据库的更为一般的静态类型系统相兼容,但...

Android02——Activity

Activity 目录 Activity 创建空白activity和layout 创建活动 设置布局 在活动中加载布局 AndroidManfiest文件中注册 在活动中使用toast Menu 销毁一个活动 Intent 显式intent 隐式intent 其他intent用法 向下一个活动传递数据 返回数据给上一个活动[没懂] ac...

android 启动模式介绍

Android启动模式 (1)Task:与Android系统是个多任务的系统中的任务是不同的。后者更倾向于多进程和多线程来说的,而这里的任务与application(应用程序)和activity(活动)有关系.从activity的角度说,任务就是activity的集合,共同完成一项工作。这些activity排列在一个栈中,这就有了下面的概念,Back栈。...

Android Activity的加载模式和onActivityResult方法之间的冲突

前言 今天在调试程序时,发现在某一Activity上点击返回键会调用该Activity的onActivityResult()方法。我一开始用log,后来用断点跟踪调试半天,还是百思不得其解。因为之前其他的Activity的LaunchMode都是Normal,没有特殊设定,这个Activity由于需求改成了singleTop。直到我确定没有一个地方是代码主...