用户界面(Activity)初探

一、简介

Activity是应用的用户界面,它运行于进程的主线程中。为了良好的用户体验,应该把会造成延迟的操作(例如网络访问)交给其他线程去做。

二、启动Activity

Activity有两种启动方式,一种是用户点击应用图标进入应用的主Acitivity,一种是根据需要用代码启动某个Activity。前者是由系统在应用的AndroidManifest.xml文件(所有Activity都应该在它里面注册相应的节点)中找到包含以下intent-filter节点的activity:

<manifest ...>

    ...

    <application ...>

        <activity
            android:name=".MainActivity" ...>

            <!-- 这个intent-filter的子元素表明这个Activity是本应用的主Activity。 -->
            <!-- 还有其他元素可供选择,也可以不设置intent-filter -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity> 

        ...

    </application>

</manifest>

然后再去找到对应的Activity类(比如上面的“MainActivity”)来启动它。后者是通过设置意图内容(Intent),接着在某个Activity中调用startAcivity()或者startActivityForResult()来启动目标Activity,例如:

Intent intent = null;
if (hasTargetAcivityName)
{
    // 启动一个指定类名的Activity
    intent = new Intent(ThisActivity.this, TargetActivity.class);
}
else
{
    /**
     * 启动一个能实现某个功能的Activity。
     * 如果有多个,系统会交给用户选择
     */
    intent = new Intent (Intent.ACTION_XXXXX);
    intent.putExtra(/* 本方法有多种重载版本 */);
    if(null == intent.resolveActivity(getPackageManager()))
    {
        // 如果没有能处理这个Intent的Activity
    }
}

if (isNotNeedResult)
{
    // 启动目标Activity,不需要其答复结果
    startActivity(intent);
}
else
{
    // 启动目标Activity,等待其答复结果
    startActivityForResult(intent, REQUEST_CODE /* 这个请求码可以自定义 */);

    /** 
     * 目标Activity可以在其onCreate()中调用getIntent()
     * 来接收Intent。在执行完之后,调用
     * setResult(RESULT_OK /* 这个结果码也可以自定义 */, intent);
     * 以及调用finish()关闭自身,即可答复运行结果。
     * 
     * 本Activity只需要实现这个方法:
     * protected void onActivityResult(int requestCode, int resultCode, Intent data);
     * 就可以在它里面处理目标Activity的执行结果。
     */
}

不管是哪种方式,一个Activity的启动过程中必定会调用到它的onCreate方法。在这个方法中,我们通常会调用setContentView(R.layout.XXX)来设置界面,以及调用findViewById(R.id.XXX)来对界面上的控件进行配置。

三、生命周期

Activity的生命周期

Activity的生命周期2
上图所展示的是,用户的焦点在不同的Activity之间切换时,当前Activity的应对方法。在这些方法中,onPause是Activity的第二个非常重要的方法。它是用户离开Activity时由系统调用的处理方法,在它里面需要进行一些保存用户数据的工作。由于内存是有限的,不同的应用会对内存资源形成竞争关系。当内存过低或者不够用时,系统就会杀掉一些应用进程,优先级越低的越容易被杀死:
Activity的优先级

package com.example.wesnoth;

import android.app.Activity;
import android.os.Bundle;


public class TestActivity extends Activity
{
    /**
     * Activity的整个生命周期从这里开始
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        /**
         * 在这里,我们通常会调用setContentView(R.layout.XXX)来设置界面,
         * 以及调用findViewById(R.id.XXX)来对界面上的控件进行配置。
         */
        setContentView(R.layout.XXXXXX);
    }

    /**
     * 当用户重新导航到这个Activity
     */
    @Override
    protected void onRestart()
    {
        super.onRestart();
    }

    /**
     * 当Activity进入用户视野
     */
    @Override
    protected void onStart()
    {
        super.onStart();
    }

    /**
     * 当Activity获得用户焦点
     */
    @Override
    protected void onResume()
    {
        super.onResume();

        /** 例如初始化相机 */
    }

    /**
     * 当Activity失去用户焦点
     */
    @Override
    protected void onPause()
    {
        super.onPause();

        /** 例如暂停播放视频、释放相机等资源 */
    }

    /**
     * 当Activity不再可见
     */
    @Override
    protected void onStop()
    {
        super.onStop();

        /** 例如写数据库。这时系统会保存控件的信息,等用户重新进入这个Activity时恢复,包括用户在EditText的输入 */
    }

    /**
     * Activity的整个生命周期在这里结束
     */
    @Override
    protected void onDestroy()
    {
        super.onDestroy();

        /** 注意:屏幕方向改变时,Activity会被销毁并重新创建 */
    }

    /** 在onStop前调用 */
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // 保存额外的信息
        savedInstanceState.put...(...);

        // 让父类保存控件状态
        super.onSaveInstanceState(savedInstanceState);
    }

    /** 在onStart后调用 */
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // 让父类恢复控件状态
        super.onRestoreInstanceState(savedInstanceState);

        // 获取保存的额外信息
        变量 = savedInstanceState.get...(...);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值