• 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案例源码下载

    点我下载源码

  • 相关阅读:
    产生财务计帐周期
    判断指定年份是否为闰年
    判断是否是闰年
    Regex quick reference
    组合外键(FOREIGN KEY)
    多列组合为主键(PRIMARY KEY)
    获取字符串开始的地址(案例)
    获取字符串结尾的电话号码(案例)
    ms sql server line feed
    如何产生连续时间?(案例)
  • 原文地址:https://www.cnblogs.com/innosight/p/3271207.html
Copyright © 2020-2023  润新知