Acitivity就是用来响应用户操作界面的一种应用组件,它也是android的四大组件之一。每个activity都被系统给予一个用来显示用户界面的窗口,这个窗口一般是填充整个屏幕,也可能比屏幕要小,在其他窗口之上显示。
一个应用通常包含了多个相互关联的Activity,并且其中一个activity被叫做main,它是这个应用程序的入口,也就是我们第一次打开应用时所看到的。为了展示不同的动作,每个Activity都能启动另一个activity。而每一个新的Activity的启动都代表前一个Activity的停止,但是系统把这Activity保存在称为‘back stack’的回退栈中。一个新的Activity的开启,都会把这个activity压入到回退栈中,并且获取到用户焦点。这个回退栈按照‘先进后出’的原则,因此,当用户操作当前的activity时,这个activity被压入栈中,当用户按下回退按钮时它就会被弹出栈,前一个activity恢复正常。
当一个新的Activity启动的时候,另一个Activity就会停止,这个停止的Activity就会通过这个Activity的生命周期的回调方法通知这个状态的改变。由于状态的改变(无论这个系统创建、停止、恢复、销毁),一个Activity可能收到几种回调方法,每一个回调方法都会让你有机会在状态改变的时候做些特殊的工作。
那么如何创建一个Activity呢?
1、首先你需要创建一个继承Activity的类;
2、在这个类中你需要实现这个Activity的生命周期的不同的回调方法;其中onCreat方法是我们必须要进行实现的方法,我们通常在这个方法中初始化用户你的Activity的一些必需的参数,最重要的是我们调用setContentView方法来定义这个activity的界面。
启动一个Activity
我们可以通过调用startActivity这个方法,并且传递一个Intent参数来启动一个Activity,这个Intent要么精确的描述了你想要启动的Activity,要么大概的描述了你想要进行的动作(这样系统还会根据你所描述的动作选择一个比较精确的Activity为你,有时甚至是另一个App的Activity)。一个Intent能够携带一些被启动的Activtity的数据。
Intent intent = new Intent(this, SignInActivity.class); startActivity(intent);
Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); startActivity(intent);
如何启动一个返回结果的Activity?
有时候,我们想要从启动的Activity中返回一个结果,这个时候我们就需要调用startActivityForResult来启动这个Activity,而为了接收这个要启动的Activity返回的结果,我们需要在第一个Activity中实现onActivtyResult方法。当第二个Activiy完成后,它就会返回一个Intent结果传递到onActivtyResult方法中。
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... } } }
如何保存Activty的状态?
正如前面我们提到的,当一个Activity停止或暂停的时候,这个Activity的状态仍然保持着,这是对的,因为当这个Activity被停止或者暂停的时候这个Object对象仍然在内存中,这也就是说这个Activity的所有成员和状态仍然保留着。因此,任何用户操作的状态变化仍然保存着,以至于当这个Activity返回到前台的时候,这些改变仍然在那里。
然而,如果这个系统为了内存销毁了一个Activity时,这个Activity对象被销毁了,因此这个系统不能仅仅简单的恢复过来。相反,这个系统肯定会重新创建这个Activtity对象,但是用户是不知道这些的,如此以来,用户可能希望,这个Acitvity恢复到原来的信息状态。在这种情况下,你能通过实现Activity的生命周期的回调方法中的onSaveInstance这个方法来保存用户重要的信息和状态。
系统会传递一个Bundle对象给这个方法,这个对象用putString和putInt方法保存着键值对。当系统杀死你的应用进程并且用户返回你的Activtiy时,系统就会重新创建这个Activity,并且传递这个Bundle给onCreate和onRestoreInstanceState方法,但是如果没有状态信息被保存,这个Bundle就会是一个NULL。
但是即使你不做任何事情,并且不实现onSaveInstanceState方法,这个Activity的状态仍然会调用onSaveInstanceState默认实现方法。在Android框架中几乎每一个组件在需要的时候都会默认实现这个方法保存可见的UI的状态信息,但是只能保存那些定义了id属性的组件,没有ID属性的组件,状态系统是无法保存的。而且只能是组件的属性值,对于其他和布局相关的值是不保存的,我们必须实现onSaveInstanceState方法来保存这些值。例如我们可以保存一个列表的所有数据。