1.6 Android的活动

要了解一个活动所经历的各个阶段,最好的办法是创建一个新项目,实现各种事件,然后使活动经受各种用户交互的考验。

【例1-1】理解一个活动的生命周期。

【实现步骤】

(1)启动Eclipse,创建一个名为Activities的工程。

(2)在MainActivity.java文件中添加下列加框的语句:

(3)按F11键在Android模拟器上调试应用程序。

(4)当活动第一次被加载时,应该可以在LogCat窗口中看到以下内容(单击Debug透视图):

          08-07 03:41:27.779: DEBUG/Events(378):In the onCreate() event
          08-07 03:41:27.779: DEBUG/Events(378):In the onStart() event
          08-07 03:41:27.779: DEBUG/Events(378):In the onResume() event

(5)如果在Android模拟器上按Back按钮,可观察以下显示内容:

          08-07 03:55:27.779: DEBUG/Events(378):In the onPause() event
          08-07 03:55:27.779: DEBUG/Events(378):In the onStop() event
          08-07 03:55:27.779: DEBUG/Events(378):In the onDestroy() event

(6)按住Home按钮不放,同时单击Activities图标可以看到以下内容:

          08-07 04:05:27.779: DEBUG/Events(378):In the onCreate () event
          08-07 04:05:27.779: DEBUG/Events(378):In the onStart () event
          08-07 04:05:27.779: DEBUG/Events(378):In the onResume () event

(7)按下Android模拟器上的Phone按钮,当前活动就会被推到后台,观察LogCat窗口中的输出:

          08-07 04:15:27.779: DEBUG/Events(378):In the onPause() event
          08-07 04:15:27.779: DEBUG/Events(378):In the onStop() event

(8)注意,onDestroy()事件并没有被调用,表明这个活动仍旧在内存中。按Back按钮退出电话拨号程序,活动又再次显示了。观察LogCat窗口中的输出:

          08-07 04:18:27.779: DEBUG/Events(378):In the onCreate() event
          08-07 04:18:27.779: DEBUG/Events(378):In the onStart () event
          08-07 04:18:27.779: DEBUG/Events(378):In the onResume () event

1.6.1 应用活动的样本与主题

默认情况下,一个活动占据整个屏幕。然而,也可以对活动应用一个对话框主题,使其显示为一个浮动对话框。例如,打算定制一个活动,以弹出窗口的形式显示它,用来提醒用户执行的一些操作。在这种情况下,以对话框形式显示活动来引起用户的注意是个很好的方法。

要对活动应用对话框主题,只要修改AndroidManifest.xml文件中Activity元素,添加android:theme属性即可:

          <?xml version="1.0" encoding="utf-8"?>
          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="net.learn2develop.Activities"
            android:versionCode="1"
            android:versionName="1.0">
              <application android:icon="@drawable/icon" android:label="@string/app_name">
                <activity android:name=".MainActivity"
                        android:label="@string/app_name"
                        android:theme="@android:style/Theme.Dialog" >
                        <!-- android:theme="@android:style/Theme.Dialog" -->
                        <intent-filter>
                            <action android:name="android.intent.action.MAIN" />
                            <category android:name="android.intent.category.LAUNCHER" />
                        </intent-filter>
                    </activity>
                </application>
                <uses-sdk android:minSdkVersion="9" />
            </manifest>

这样可以使用活动显示一个对话框,如图1-38所示。

图1-38 显示对话框

1.6.2 显示对话框

用户经常需要显示一个对话框窗口,以便从用户那里得到确认。这时,可以重写在Activity基类中定义的受保护的onCreateDialog()方法来显示一个对话框。

【实现步骤】

(1)在Eclipse环境下,创建一个名为ExampeDialog的工程。

(2)打开res/values目录下的strings.xml,在其中输入如下代码。

            <resources>
                <string name="app_name">ExampleDialog</string>
                <string name="hello_world">ExampleDialog</string>
                <string name="menu_settings">Settings</string>
                <string name="title_activity_main">ExampleDialog</string>
            </resources>

(3)打开res/layout目录下的main.xml文件,将其中已有的代码替换为如下代码。

            <?xml version="1.0" encoding="utf-8"?>
            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >
            <TextView
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello_world" />
          <Button
              android:id="@+id/btn_dialog"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="Click to display a dialog" />
          </LinearLayout>

(4)打开src/com.example.exampledialog目录下的MainActivity.java文件,将其中代码代换为如下代码。

          package com.example.exampledialog;

          import android.os.Bundle;
          import android.app.Activity;
          import android.app.AlertDialog;
          import android.app.Dialog;
          import android.content.DialogInterface;
          import android.view.View;
          import android.widget.Button;
          import android.widget.Toast;

          import android.app.ProgressDialog;
          import android.os.Handler;
          import android.os.Message;

          public class MainActivity extends Activity {
              CharSequence[] items = { "Google", "IBM", "Microsoft" };
              boolean[] itemsChecked = new boolean [items.length];

              /** 当活动第一次被创建时调用 */
              @Override
              public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                Button btn = (Button) findViewById(R.id.btn_dialog);
                btn.setOnClickListener(new View.OnClickListener() {
                  public void onClick(View v) {
                        showDialog(0);
                    }
      });
  }
  @Override
  protected Dialog onCreateDialog(int id) {
      switch (id) {
      case 0:
        return new AlertDialog.Builder(this)
        .setIcon(R.drawable.ic_action_search)
        .setTitle("这是一个带简单文本的对话框")
        setPositiveButton("确定", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog,
            int whichButton)
            {
                Toast.makeText(getBaseContext(),
                    "确定clicked!",Toast.LENGTH_SHORT).show();
            }
          });
          .setNegativeButton("取消", new
            DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                int whichButton)
            {
                  Toast.makeText(getBaseContext(),
                    "取消clicked!",Toast.LENGTH_SHORT).show();
            }
          });
          .setMultiChoiceItems(items, itemsChecked, new
            DialogInterface.OnMultiChoiceClickListener() {
                    @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        Toast.makeText(getBaseContext(),
                    items[which]+(isChecked?" 选中!":"未选中!"),
                          Toast.LENGTH_SHORT).show();
                    }
                }
          )
          .create();
      }
      return null;
  }
}

按F11键在Android模拟器上调试应用程序。单击“Click to display a dialog”按钮得到如图1-39所示的效果。

图1-39 单击按钮显示对话框

以上代码使用setPositionButton()和setNegativeButton()方法分别设置了两个按钮:“确定”和“取消”。还可以通过setMultiChoiceItems()方法设置一个复选框列表供用户选择。对于setMultiChoiceItems()方法,需要传入两个数组:一个是要显示的项列表,另一个包含了表明每个项是否被选中的值。当选中一个项时,使用Toast类来显示一条信息,如图1-40所示。

图1-40 使用Toast类来显示信息效果

1.6.3 显示进度条对话框

除了前面介绍的普通对话框外,还可以创建进度条对话框。进度条对话框对于显示一些活动的进度有用,如下载操作的状态。

【实现步骤】

(1)使用1.6.2节创建的同一个工程,在MainActivity.java文件中添加以下加框代码。

(2)按F11键在Android模拟器上对应用程序进行调试。单击按钮即可显示进度条对话框,如图1-41所示。注意观察进度条将累计到100。

图1-41 进度条对话框