Java轉Android:第5天 用Activity和Intent實現小通訊錄

語言: CN / TW / HK

theme: juejin

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第5天,點選檢視活動詳情


今天學習Activity和Intent,學完之後,可以實現頁面帶參跳轉(首頁->詳情->撥號): 撥號盤.GIF

一、我講

今天,我主要講,第一:Activity的生命週期,應用場景;第二:Intent的用途,利用它實現Activity之間的傳值跳轉。

1.1 窗體 Activity

對於Activity我們已經不陌生了,前面幾期都用到了,我是這麼解釋的:

新建的專案,layout資料夾下的xml管檢視,java檔案下的Activity管邏輯。

image.png

Activity的程式碼就像下面這樣: java public class MainActivity extends Activity { …… @Override protected void onResume() { super.onResume(); } …… } 其實,它的本質是提供一個螢幕,並處理使用者和此螢幕的互動。

有時候,你使用App時,一個頁面跳到另一個頁面,有可能就是一個Activity跳到另一個Activity

生命週期

生命週期是一個枯燥的理論,但是在專案實戰中卻很有用。生命週期是面試必問的話題之一,一些工作兩三年的應聘者,會嫌問的刁鑽,他們說實際做專案根本用不到。相反,5年以上安卓開發,對這個問題卻能很好地回答。

生命週期,可以通俗地理解為“從搖籃到墳墓”的整個過程。 人的生命週期.png

Activity也是有生命週期的。相信大家都看到過這個圖,這是安卓官方文件的一張圖。 官方生命週期.png

我總結成下面這個圖,80%的精華都在這6個函式上。

程式生命週期.png

我們重點關注Activity什麼時候建立銷燬、可見不可見、能不能開始互動。有時候雖然介面可見,但是你沒法和介面互動(比如一個Dialog風格的Activity_B覆蓋在Activity_A上面,雖然你能看見A,但是無法點選,此時A處於生命週期的onPause。如果一個AlertDialog對話方塊在Activity_A上彈出,雖然A也是可見不可互動,但是並不執行onPause方法)。

寫程式更多的是處理異常情況,Activity生命週期的應用場景,多數也是用在一些異常情況上。

image.png

瞭解什麼時候處於什麼狀態,這一點非常關鍵。

看下面這個小例子,非常能說明問題: - 當第一次開啟Activity,它提示:初次見面,多多關照。 - 當你準備要切換到其他程式時,它提示:等您回來。 - 當你後悔了,不切了,它提示:繼續為您服務。 - 當你狠心退出,它又提示:再見,再見

App狀態.GIF

你敢說,你的App不會被使用者這麼操作嗎?你能不關注這些操作對你正向流程的衝擊嗎?

1.2 意圖 Intent

它負責對應用中一次操作的動作及資料進行描述,Android則根據此Intent的描述,找到對應的元件,完成呼叫。

一句話解釋就是:你要去找誰(目標元件,比如Activity)?帶著什麼禮物(動作、描述)?

Intent.png

上面那個圖,如果Activity-1想要啟動Activity-2,那麼就可以通過Intent

跳轉指定Activity

Intent通過如下方式實現兩個Activity之間的傳值跳轉。

image.png

跳轉指定意圖

除了跳轉到明確的ActivityIntent也支援隱式跳轉,比如它說我要打電話,發簡訊,系統就會分配到對應的跳轉目標。 ```java // 呼叫系統打電話 Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:12345")); startActivity(intent);

// 呼叫系統發簡訊 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:12345")); startActivity(intent); ```

二、你做

下面,我們要做這麼一個功能,類似於通訊錄:

第一個頁面是聯絡人主頁面MainActivity,上面只展示一個張三。點選張三,攜帶著張三的姓名和電話,跳轉到第二個詳情頁面DetailActivity,第二個頁面有個撥號按鈕,點選調到系統的撥號盤。

撥號盤.GIF

首先,我們先寫MainActivity的佈局檔案activity_main.xml,上面只有一個按鈕。 ```xml

`` 注意啦,注意啦,上面的TextView有一個屬性onClick="toDetail",另外ConstraintLayout還有一個屬性context=".MainActivity",這代表TextView有一個叫toDetail的點選事件在MainActivity中。這種方式可以替代textView.setOnClickListenner`設定按鈕事件。

下面就可以看到MainActivity裡有一個toDetail(View view)方法,正好對應xml裡的設定。在這個方法裡,我們看到,它採用Intent進行傳值跳轉。 ```java public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void toDetail(View view) {

    Intent intent = new Intent(this, DetailActivity.class);
    intent.putExtra("name","張三");
    intent.putExtra("phone","666666");
    startActivity(intent);
}

} ```

下面是跳轉進入的詳情頁DetailActivity的佈局activity_detail.xml,裡面是2個文字,一個撥號按鈕,同樣,撥號按鈕也採用了android:onClick="call"的定義模式。

```xml