传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/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);
}
}