(内容:如何建立、使用activity; activity生命周期。) java
Activity 是一个为用户提供交互接口的组件,每一个activity都会有一个window来显示本身的界面。 应用能够由多个互相“弱关联”的activity组成,activity能够启动另一个activity, 有activity启动的时候,当前的就会被暂停,系统把被暂停的activity存储在一个FILO(先进后出)的栈中,当用户点击“back”时,位于栈顶的activity就会从新被显示出来。 android
Activity 提供一系列的接口,在生命周期运行到特定的阶段时会通知相应的接口,用户在这些回调接口中作当前阶段的处理。例如,在create时初始化应用的资源,stop时做资源的释放。 数组
建立一个activity必须继承为Activity的子类,并覆盖所须要生命周期的回调方法。比较重要的2个方法: app
onCreate(): 系统在建立activity时会调用,必需要覆盖的方法。应该在此阶段作初始化工做,layout必定要在这里被初始化:调用setContentView() 设置activity的界面。 ide
onPause(): 用户离开这个activity时系统调用的第一个方法,鉴于用户不必定会再返回这个activity,应该作数据持久化的处理。 布局
生命周期的其余部分会在后面继续讨论。 this
用户界面由含有层级关系的一个或多个View组成,每个View控制屏幕的一个矩形区域,且能够相应用户的操做。术语Widgets表示用户可见或可交互的View,Layout 则是ViewGroup,它包含的view提供布局的规则。 google
android已经提供了一系列的组件如button、textview等,咱们能够直接使用,也能够继承View 或 ViewGroup,实现特定功能的控件。 spa
将布局传递给activity通常的作法是在xml中定义本身的界面,而后使用setContentView()布局。 .net
Activity必须在所属应用的Manifest.xml中声明,否则系统会找不到,最简单的声明能够按照如下格式:
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ... </manifest >
android:name对应这个activity的路径,包名和java名。还有其余可选的属性如label,theme等。
在声明以后,还能够为activity加上其余属性,若是这个activity是用在显示在桌面上的主程序,就应该加上如下内容,否则程序找不到主入口了:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
在一个activity中,使用startActivity()启动另一个activity,为了注明要跳转到哪里activity,须要使用Intent:
//从当前的activity跳到“YourActivity” Intent intent = new Intent(this, YourActivity.class); startActivity(intent);
除了直接指定class名,android提供了另一种特殊的方式:
你的应用可能须要别的程序为你完成一些特定操做,只要为Intent指定一个Action,系统就会为你找到接收这个action的activity。(Intent的最精华的做用在于此,实现松耦合)
例如你的程序须要发送一封邮件给指定的收件人,intent须要一个action和 收件人的列表做为data,Email编辑界面会为你加载这些数据,这里的recipientArray会被读取并显示在Email的收件人编辑框中:
Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL,recipientArray); startActivity(intent);
startActivity()只是告诉系统要启动一个activity, 但有些状况下,咱们还须要启动的activity为咱们完成一项工做后返回结果和数据,能够用如下方法:
startActivityForResult(Intent i, int requestCode); //requestCode 标记这个activity例子,须要用户从电话本选取一个联系人并返回给当前activity作处理:
private void pickContact() { // Create an intent to "pick" a contact, as defined by the content provider URI Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); startActivityForResult(intent, PICK_CONTACT_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // If the request went well (OK) and the request was PICK_CONTACT_REQUEST if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { // Perform a query to the contact's content provider for the contact's name Cursor cursor = getContentResolver().query(data.getData(), new String[] {Contacts.DISPLAY_NAME}, null, null, null); if (cursor.moveToFirst()) { // True if the cursor is not empty int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); String name = cursor.getString(columnIndex); // Do something with the selected contact's name... } } }
finish() 和 finishActivity()均可以关闭一个activity,但google建议:除了必须时,不要直接调用这些接口,应该交由系通通一管理生命周期。
一个activity的生命周期直接受到其余activity、当前任务或back stack的影响,经过生命周期的接口对activity进行管理,能够创建更加健壮和灵活的程序。
如下回调方法对应着生命周期的几个状态:
public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // The activity is being created. } @Override protected void onStart() { super.onStart(); // The activity is about to become visible. } @Override protected void onResume() { super.onResume(); // The activity has become visible (it is now "resumed"). } @Override protected void onPause() { super.onPause(); // Another activity is taking focus (this activity is about to be "paused"). } @Override protected void onStop() { super.onStop(); // The activity is no longer visible (it is now "stopped") } @Override protected void onDestroy() { super.onDestroy(); // The activity is about to be destroyed. } }
若是覆盖以上的所有方法,咱们就能够完整地管理activity 生命周期的3个阶段(但实际上某些时候只须要其中几个),在不一样阶段应该作相应级别的处理:
生命周期的经典图示:
onCreate: activity被建立时调用。初始化静态数据的操做:建立view,为list绑定数据等。它有一个Bundle做为参数,存放 着这个activtiy以前的状态(onSaveInstanceState())。以后调用的必定是onStart()。
onRestart: activity被stop后,还原时调用。以后调用的必定是onStart()。
onStart: 在activity显示在屏幕以前调用。若是activity转到前台会调用onResume(),若是界面被遮挡则进入onStop()。
onResume(): 在能够和用户交互以前调用。 activity已经被置于栈顶。 onPause()在其后调用。
onPause(): 在另外一个activity即将resume时被调用。通常用来保存数据和中止一些消耗CPU的操做等。鉴于界面正 在跳转,为了避免阻塞,这里的操做应该越快完成越好。 activtiy若回到显示状态将会调onResume(), 不然 随后调用onStop()让它消失在屏幕上。
onStop(): 在界面彻底被遮挡住前调用。 这时,可能activity即将被destroy,或者其余activity resume并遮住了它。 activtiy若将从新显示则调用onRestart(), 不然进入onDestroy() 将其毁灭。
onDestroy(): activity即将被灭掉了。这是最后一个被调用的周期方法。 致使destroy的多是用户指定finish(), 或者系统 为了节省空间。 isFinishing()能够区分这两种状况。
注意:onPause()方法实际上是系统必定会调用的最后一个生命周期方法,onStop(), onDestroy()都不保证必定能调到,因此重要的事情应该在onPause()里面完成(保存数据等),且选择必须保留的数据,避免阻塞下一个activity。
activity 的回调方法 onSaveInstanceState() 能够用于保存activity状态,方法提供Bundle参数给咱们保存数据,若是系统kill掉了这个activity,用户return回去的时候,咱们能够经过onCreate()(或者onRestoreInstanceState())的Bundle参数提取出这些数据。
onSaveInstanceState()默认保留各类View的显示状态(checkbox是否勾上等),咱们须要作的是保存与界面绑定的一些变量值,如记录checkbox值的数组,而且确保layout中的重要view都有本身的id,不然它的状态没法保存。若是覆盖此方法,应该在开始便调用super.onSaveInstanceState(),由于它默认会帮组咱们记录view的状态。