本文参考\android\android\frameworks\base\core\java\android\app\Activity.java文件中的类注释,以及android/frameworks/base/docs/html/guide/components/activities.jd文件
One Activity简介:
Activity是一个单独的、可以和用户交互的东西。几乎所有的activities都要与用户交互,所以activity承担着创建window的重任,你可以通过setContentView的方法往window里填充view。通过一个主题属性android.R.attr#windowIsFloating来设置activities是全屏显示full-screen还是悬浮窗isfloat(比如dialog,或者是一个悬浮的view),当然这里所说的全屏显示不包括状态栏。
<!-- 全屏显示 -->
<item name="windowIsFloating">false</item>
在对应的主题中有dialog主题样式的
<!-- 悬浮窗显示 -->
<style name="Theme.Material.BaseDialog">
''''''
<item name="windowIsFloating">true</item>
''''''
</style>
在继承Activity时需要实现两个方法
- onCreate: 在该方法中初始化activity。更重要的是,通常需要在该方法中调用setContentView方法来加载layout文件,并且用findViewById来检索需要和你进行交互的layout文件中的控件。
- onPause :在用户离开该activity时调用该方法处理。用户做出的任何修改都应该在该方法中提交commit(通常保存提交的数据使用android.content.ContentProvider)。
为了能够使用 android.content.Context#startActivity Context.startActivity()打开一个activity,我们需要将activity在对应包下的androidmanifest文件中使用activity节点进行声明
<application android:icon="@drawable/icon"
''''''
<!-- 声明activity -->
<activity android:name=".MainMenuActivity"
''''''
</activity>
''''''
</application>
Two 与activity相关的主题有
- #Fragments
- #ActivityLifecycle
- #ConfigurationChanges
- #StartingActivities
- #SavingPersistentState
- #Permissions
- #ProcessLifecycle
一,Fragments:
fragment简介
Fragment开始于Android3.0,是应用程序组件碎片的意思,可以被放在activity内部。通过FragmentManager来管理与fragment的交互。fragmentmanager的对象可以通过两种方式获取到
- Activity#getFragmentManager() Activity.getFragmentManager()
- Fragment#getFragmentManager() Fragment.getFragmentManager()
fragment类可以用来获取各种各样的结果,在它内部,它代表一个普通的操作或者是交互接口。fragment与包含他的activity紧密相连,fragment依赖于activity存在。虽然fragment有它自己的生命周期,但fragment的生命周期与activity的生命周期息息相关。fragment生命周期图如下:
fragment依附于activity存在,当activity被stopped之后,activity中的fragment不能够started。当activity销毁后,位于activity中的fragment也随之销毁。
所有Fragment的子类必须包含一个无参的构造方法。当有需要时尤其是在状态恢复期,framework层会经常重新初始化fragment,framework会去找无参构造器去初始化fragment。如果fragment中无参构造器不可用的话就会在状态恢复时抛出 runtime exception 。
fragment相关主题有:
- #OlderPlatforms旧版本
- #Lifecycle生命周期
- #Layout布局
- #BackStack
OlderPlatforms:
fragment 是在Android3.0才加入进来的,所以在Android3.0之前如果想要使用fragment可以使用android.support.v4.app.FragmentActivity具体可以参考
fragments for all
Lifecycle
- #onAttach 当fragment与activity绑定时调用
- #onCreate 当fragment初始化创建时调用
- #onCreateView创建并返回与fragment相关的view视图
- #onActivityCreated 通知fragment它所绑定的activity已经oncreate
- #onViewStateRestored 通知fragment所保存的所有view的状态已经被恢复
- #onStart fragment对用户可见
- #onResume fragment对用户既可见又获取焦点
- #onPause fragment不再能和用户交互(activity被paused或者fragment之间的操作)
- #onStop fragment对用户不可见(activity被stopped或者fragment之间的操作)
- #onDestroyView 清除与fragment相关的所有views相关资源
- #onDestroy 清除fragment状态
- #onDetach 当fragment与activity解绑时调用
layout
fragment可以作为应用程序布局的一部分,借助fragment,activity可以更好的 模块化,为更大的屏幕创建更复杂的用户交互,帮助应用实现小屏和大屏之间的尺寸的切换。例如,在一个activity上可以编写一个有item列表的fragment,然后再组合一个fragment去显示每个item的详细信息。
<fragment
class="com.example.android.wifidirect.DeviceListFragment"
android:id="@+id/frag_list"
android:layout_width="match_parent"
android:layout_height="@dimen/phone_list_height">
<!-- Preview: layout=@layout/row_devices -->
</fragment>
fragment相关可以参考:
fragment嵌套
fragment与activity
二,ActivityLifeCycle
在系统中,activity被一个称为activity栈activity stack的东西在管理。当新创建一个activity时,就被被放在栈顶,并且成为正在运行的activity—-先前的activity会被保留在activity的下方,当位于栈的activity退出后,位于该activity下方的activity就会运行到前台,activity栈遵循栈的原则:后进先出。
一个activity基本上有四种状态