Activity 之使用

Activity 之使用

本文內容
1. 使用 Activity 顯式簡單界面
2. Activity 之間的跳轉
    2.1 startActivity
    2.3 startActivityForResult
3. Activity 之間的數據交互
4. Activity 的啓動
    4.1 顯示啓動
    4.2 隱式啓動
5. 啓動系統中常見的 Activity
    5.1 打開瀏覽器網頁
    5.2 打開相冊
    5.3 打開發送短信界面
    5.4 打開撥號界面
6. 結束 Activity

1. 使用 Activity 顯式簡單界面

  • 建立一個 Activity 的子類 MainActivity ,繼承 Activity
package com.zhangmiao.activityproject;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 建立 MainActivity 的界面 activity_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">

    <TextView
        android:id="@+id/main_activity_message_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:freezesText="true"
        android:text="這是 MainActivity" />
</LinearLayout>
  • 在清單文件中聲明 MainActivity
<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2. Activity 之間的跳轉

2.1 startActivity

  經過調用 startActivity() 方法能夠啓動其餘 Activity,在 Intent 中指定想要啓動的 Activity ,Intent 對象還可能攜帶少許數據傳遞給想要啓動的 Activity。html

  • 簡單的 MainActivity 跳轉 FirstActivity 界面
    Intent firstIntent = new Intent(MainActivity.this, FirstActivity.class);
                  //攜帶數據
                  firstIntent.putExtra("from", "MainActivity");
                  startActivity(firstIntent);

2.2 startActivityForResult

  有時,可能須要從啓動的 Activity 得到結果。在這種狀況下,就經過 startActivityForResult() 方法來啓動 Activity ,被啓動的 Activity 經過 setResult() 方法返回數據,啓動的 Activity 經過 onActivityResult() 方法獲取返回的數據。android

  • 簡單的 MainActivity 跳轉 FirstActivity 界面,FirstActivity 返回數據給 MainActivityweb

    Intent firstIntent = new Intent(MainActivity.this, FirstActivity.class);
    firstIntent.putExtra("from", "MainActivity");
    startActivityForResult(firstIntent,10001);
  • FirstActivity 在合適的位置返回數據給 MainActivity數組

    Intent intent = new Intent();
          intent.putExtra("result","OK");
          setResult(20001,intent);
  • MainActivity 接收 FirstActivity 返回的數據瀏覽器

    @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (requestCode == 10001 && resultCode == 20001){
              if (data != null) {
                  String result = data.getStringExtra("result");
              }
          }
      }

3. Activity 之間的數據交互

  可使用 Intent 對象進行數據的傳遞。Intent 重載了不少 putExtra() 方法,包括了 Java 八大基本類型以及其數組類型等。app

  • MainActivity 跳轉 FirstActivity 界面,並傳遞 String 類型的數據
Intent firstIntent = new Intent(MainActivity.this, FirstActivity.class);
firstIntent.putExtra("from", "MainActivity");
startActivityForResult(firstIntent,10001);

  Intent 對象還有一個 putExtras(Bundle bundle) 方法,就是把須要傳遞的數據組合在一塊兒進行傳遞。ide

  • MainActivity 跳轉 FirstActivity 界面,使用 putExtras(Bundle bundle) 傳遞數據
Intent firstIntent = new Intent(MainActivity.this, FirstActivity.class);
Bundle bundle = new Bundle();
bundle.putString("from", "MainActivity");
bundle.putInt("count", 1);
firstIntent.putExtras(bundle);
startActivityForResult(firstIntent,10001);

4. Activity 的啓動

4.1 顯示啓動

  顯示啓動的方式:post

  1. 直接在 Intent 構造方法啓動:this

    Intent firstIntent = new Intent(MainActivity.this, FirstActivity.class);
  2. setComponentspa

    ComponentName componentName = new ComponentName(this,FirstActivity.class);
    Intent firstIntent = new Intent();
    firstIntent.setComponent(componentName);
    startActivity(firstIntent);
  3. setClass / setClassName

    Intent firstIntent = new Intent();
    firstIntent.setClass(this,FirstActivity.class);
    firstIntent.setClassName(this,"com.zhangmiao.activityproject.FirstActivity");
    startActivity(firstIntent);

4.2 隱式啓動

  隱式啓動就是要在該 Activity 中設置 IntentFilter 屬性,只要啓動的 Intent 匹配 IntentFilter 的條件就能夠啓動相應的 Activity 。

  對於想要做出響應的每個 Intent 類型,必須加入相應的 < intent-filter >,其中包括一個 < action > 元素,還可選擇性地包括一個 < category > 元素或一個 < data > 元素。這些元素指定 activity 能夠響應的 Intent 類型。

  • 例如調用系統的相冊
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivity(intent);

5. 啓動系統中常見的 Activity

  系統給咱們提供了不少經常使用的 Activity,能夠用來打開瀏覽器,打開發短信界面,打開相冊界面,打開撥號界面等等。

5.1 打開瀏覽器網頁

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

5.2 打開相冊

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);

5.3 打開發送短信界面

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SNED);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Hello World!");
startActivity(intent);

5.4 打開撥號界面

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);

6. 結束 Activity

  能夠經過調用 Activity 的 finish() 方法來結束 Activity 。還能夠經過調用 finishActivity() 方法結束以前啓動的另外一個 Activity 。
  大多數狀況下,不該該使用 finish() 或 finishActivity() 方法來結束 Activity 。Android 系統會管理 Activity 的生命週期,會在合適的時機結束 Activity 。調用結束 Activity 的方法可能對預期的用戶體驗產生不良影響,所以只應該在確實不想讓用戶返回此 Activity 實例時使用。

參考文章:

  1. Activity 必知必會
  2. Android之Activity系列總結(一)—Activity概覽
  3. Android四大組件之Activity詳解