Android紫衫龙王之Activity
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229
本节我们学习Android四大天王的Activity,Activity密切关注用户能做什么,负责与用户交互。类似于Java Web中的页面Page,将一系列View装载起来通过内部的加载引擎展现给前台用户。可以说一个简单的Android应用就是由一组Activity组合而成。可见对于Activity的学习在整个Android移动开发学习中至关重要的一环。鉴于Android移动开发属于嵌入式系统开发的范畴,所以Google的工程师在Android平台构架设计上,将很多组件都设计成基于事件驱动的,不推荐开发者采用手动的方式去主动调用它们的行为,这些行为将全部交给系统进行统一管理。因此掌握它们的生命周期是学好它们的根本所在。另外,与Service一样,Activity也是通过Intent来调用,Intent携带的数据能在多个Activity之间传递。
1创建Activity
(1)继承API的Activity类public class MyActivity extends Activity {...}(2)在AndroidManifest.xml的<application>标签中对创建的进行注册
<activity android:name=".MyActivity" />
2启动Activity
Activity可以自己运行,不过仅限于应用中的主Activity(action:"android.intent.action.MAIN" | category:android.intent.category.LAUNCHER"),其他从Activity需要通过Context.startActivity(...)或startActivityForResult(...)方法来启动。这两种方法的使用场合有所不同。
2.1采用Context.startActivity(...)方法启动Activity
采用这种方式启动Activity,当前Activity可以将一些数据交给Intent携带传递给新的Activity,这种传输数据的方式类似于Java Web中的request|session.setParameter(...)和request|session.getParameter(...)在页面或会话中传递和接收参数。新的Activity被启动之后与当前Activity再无联系,自身自灭。
2.2采用Context.startActivityForResult(...)方法启动Activity
采用这种方式启动Activity,除了具有Context.startActivity(...)启动的功能之外,还希望得到新的Activity关闭之后返回的结果。这样的需求很常见,比如选取多个图片中的一张,我们希望知道是选取的这张图片是属于Activity的,然后进行针对性的处理。该方法传递两个参数:
intent:意图,用来标示当前Activity跳转的目的地。
requestCode:请求码,用来标示当前Activity发送请求给新Activity的信令。当新Activity关闭之后,可在当前Activity的onActivityResult(...)中匹配此码进行处理
当前Activity需要复写onActivityResult(...)方法来结果新Activity关闭之后返回的结果。它有三个参数:
requestCode:请求码,作用如上。
resultCode:结果码,用来标示新Activity返回结果的信令,类似于Http请求的服务器端的响应码。
intent:意图,携带新Activity返回结果的数据。
此外,新Activity还需要调用setResult(...)方法设置结果码和返回数据。
3Activity生命周期
先看官方提供Activity生命周期示意图,然后我们再进行总结。
从上图可以看出,其实Activity的生命周期可以分为如下三个场景:
(1)完整生命周期:onCreate() ☞ onStart() ☞ onResume() ☞ onPause() ☞ onStop() ☞ onDestroy()(2)可见生命周期:onStart() ☞ onResume() ☞ onPause() ☞ onStop() ☞ onRestart() ☞ ... loop
(3)交互生命周期:onResume() ☞ onPause() ☞ ... loop
4Activity案例
4.1案例代码陈列
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.lynn.activity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".MainActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".PauseActivity" android:theme="@android:style/Theme.Dialog" /> <activity android:name=".StopActivity" /> </application> </manifest>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Android四大天王之Activity</string> <string name="pause">暂停MainActivity</string> <string name="stop">停止MainActivity</string> </resources>
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/pause" android:onClick="onPauseAct" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/stop" android:onClick="onStopAct" /> </LinearLayout>
PauseActivity的布局文件:pause.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
StopActivity的布局文件:stop.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
MainActivity.xml
package cn.lynn.activity; import cn.lynn.activity.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; // 设置请求码 private static final int REQUEST_CODE = 0x31; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "onCreate()"); } public void onPauseAct(View v) { startActivity(new Intent(this, PauseActivity.class)); } public void onStopAct(View v) { // 期望销毁StopActivity后能够返回结果 startActivityForResult(new Intent(this, StopActivity.class), REQUEST_CODE); } // 获取销毁StopActivity后返回的结果 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_CODE) { // 匹配请求码 if(resultCode == RESULT_OK ) { // 匹配结果码 String result = data.getExtras().getString("result"); Log.i(TAG, result); } } } @Override protected void onStart() { Log.i(TAG, "onStart()"); super.onStart(); } @Override protected void onRestart() { Log.i(TAG, "onRestart()"); super.onRestart(); } @Override protected void onResume() { Log.i(TAG, "onResume()"); super.onResume(); } @Override protected void onStop() { Log.i(TAG, "onStop()"); super.onStop(); } @Override protected void onPause() { Log.i(TAG, "onPause()"); super.onPause(); } @Override protected void onDestroy() { Log.i(TAG, "onDestroy()"); super.onDestroy(); } }
PauseActivity.xml
package cn.lynn.activity; import cn.lynn.activity.R; import android.app.Activity; import android.os.Bundle; public class PauseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("我是PauseActivity"); setContentView(R.layout.pause); } }
StopActivity.xml
package cn.lynn.activity; import cn.lynn.activity.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class StopActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("我是StopActivity"); setContentView(R.layout.stop); // 构建携带返回数据的Intent Intent data = new Intent(); // 设置返回数据的类型和内容 data.putExtra("result", "我是从StopActivity返回的数据"); // 设置返回的数据和结果码 setResult(RESULT_OK, data); } }