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);
    }

}

4.2案例效果展示

  
        启动本应用加载MainActivity,控制台LogCat输出如下:
        点击“Back”键退出本应用,控制台LogCat输出如下:
        再次启动本应用加载MainActivity,然后点击“暂停MainActivity”按钮,加载PauseActivity,控制台LogCat输出如下:
        在PauseActivity界面中点击“Back”键退出PauseActivity,控制台LogCat输出如下:
        完全退出本应用,再一次进入本应用加载MainActivity,然后点击“停止MainActivity”按钮,加载StopActivity,控制台LogCat输出如下:

        在StopActivity界面中点击“Back”键退出StopActivity,控制台LogCat输出如下:

4.3案例源码下载

点我下载源码

原文地址:https://www.cnblogs.com/innosight/p/3271207.html