1. 程式人生 > >活動1(活動在配置檔案的註冊,Menu,活動的切換、銷燬,活動間資料的傳遞)

活動1(活動在配置檔案的註冊,Menu,活動的切換、銷燬,活動間資料的傳遞)

活動是Android平臺上應用程式的基本構建塊之一。它們充當使用者與應用程式互動的入口點,也是使用者如何在應用程式中導航(如“後退”按鈕)或應用程式之間(與“最近”按鈕一樣)的核心。

一.在AndroidManifest中註冊活動

活動的註冊宣告放在<application>標籤中,通過<activity>標籤對活動進行註冊,在<activity>中用 android:name 指定具體的活動名稱,在<activity>標籤內部加入<intent-filter>標籤,並新增<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />這兩句宣告的活動表示程式的主活動。

除此之外,android:label 可以用來指定活動中標題欄的內容,標題欄顯示在活動最頂部。如果是給主活動指定的label不僅會成為標題欄中的內容,也會成為應用程式顯示的名稱。在<activity>標籤下指定android:theme可以讓活動指定主題,比如說對話方塊式就可以指定 android:theme="@style/Theme.AppCompat.Dialog"。

 

二.在活動中使用Menu

1.在res目錄下新建一個menu資料夾,在menu資料夾下新建Menu resource file,然後命名其為main(作為主活動的Menu)。

假設菜單隻有兩項,即新增和刪除。可以在main中用如下程式碼:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="Add" />
    <item
        android:id="@+id/remove_item"
        android:title="Remove" />
</menu>

其中<item>標籤表示具體的一個選單項,android:id 指定識別符號,android:title指定選單項的名稱。

 

2.在activity的java類中重寫 boolean onCreateOptionsMenu(Menu menu) 方法,如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

getMenuInfalter()方法獲得MenuInflater物件,再呼叫其inflate()方法就可以建立選單了。inflate()中有兩個引數,前者表示要使用哪一個資原始檔建立選單,後者指定選單項將新增到哪個Menu物件中。最後返回true,表示允許建立的選單顯示,返回false就無法顯示選單。

 

3.經過前面兩個步驟只是能夠將選單顯示出來,如果要響應選單中對應的操作,則要重寫 boolean onOptionsItemSelected(MenuItem item) 方法,如下:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add_item:
                // ...
                break;
            case R.id.remove_item:
                // ...
                break;
            default:
        }
        return true;
    }

其中通過item.getItemId()判斷點選的是哪一個選單項。

 

三.銷燬一個活動

可以通過Back鍵銷燬當前活動,也可以通過Activity類中提供的finish()方法銷燬當前活動。

 

四.活動之間的切換(使用 Intent)

Intent 大致分兩種,顯式Intent 和 隱式Intent。

顯式Intent:Intent中有多個構造方法,其中有一個是Intent(Context packageContext,Class<?> cls),第一個引數表示啟動活動的上下文,第二個引數表示要指定啟動的目標活動。Activity中提供了一個方法startActivity(),這個方法是用於啟動活動的。所以通過如下程式碼啟動目標活動:

Intent intent = new Intent(AActivity.this, BActivity.class);
startActivity(intent);

 上述程式碼描述的是從A活動跳轉到B活動。顯式Intent往往用於在同一個軟體內跳轉頁面所使用的。

隱式Intent:它不指明我們要啟動哪一個活動,而是通過action和category來選擇所要啟動的活動。

比如在一個Activity的<intent-filter>標籤中設定如下:

<intent-filter>
    <action android:name="A" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

如果我們想要通過隱式Intent來啟動當前活動,就必須匹配指定的action和category才能響應到該Activity,所以可以通過如下程式碼:

Intent intent = new Intent("A");
startActivity(intent);

由於 android:name="android.intent.category.DEFAULT" ,這個category是預設值,呼叫startActivity時已經自動新增到Intent中,所以不用再特意的進行匹配category。

每個 Intent 中只能指定一個 action ,但能指定多個 category 。當我們給Intent新增其它的category時,如下:

Intent intent = new Intent("A");
intent.addCategory("B");
startActivity(intent);

當我們執行程式時,程式奔潰,觀察logcat可以看到沒有可以響應的活動,所以如下操作也是必須的:

<intent-filter>
    <action android:name="A" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="B"/>
</intent-filter>

這時程式正常執行。

 

五.活動間傳遞資料

向下一個活動傳遞資料:通過 putExtra() 方法實現,然後在下一個活動中取出來即可。比如說要從A活動傳遞內容到B可以通過如下程式碼實現:

// A的程式碼
Intent intent = new Intent(AActivity.this,BActivity.class);
intent.putExtra("key","value");
startActivity(intent);

其中 putExtra() 有兩個引數,前者是鍵,後者是值,B活動通過鍵來取值。如下:

// B的程式碼
Intent intent = getIntent();
String data = intent.getStringExtra("key");

首先getIntent()獲取啟動B活動的Intent,然後呼叫getXxxExtra即可獲取傳遞的資料,其中的引數就是A中的鍵。

 

返回資料給上一個活動: Activity中有一個方法是 startActivityForResult(Intent intent,Int requestCode),該方法可以實現返回資料給上一個活動。第一個引數是Intent,第二個引數是請求碼,用於在後面的回撥過程中判斷資料來源。

比如說其中A活動中的某一個值要到B活動中獲得,所以A先要跳轉到B,然後當B返回時,將值傳遞迴A,程式碼如下:

// 這是在A中的操作,A先要跳轉到B進行相關操作,其中請求碼為1
Intent intent = new Intent(AActivity.this,BActivity.class);
startActivityForResult(intent,1);
// 這是在B中的操作,其中的intent只是用於傳遞資料。其中有一個方法是
// setResult(),它是專門向上一個活動返回資料的,其中包含兩個引數,
// 第一個引數用於向上一個引數返回處理結果,第二個引數是將帶有資料的
// intent傳遞回去,最後通過finish()銷燬當前活動。
Intent intent = new Intent();
intent.putExtra("key_return","value");
setResult(RESULT_OK,intent);
finish();
// 這是在A中的操作,也是最後一步操作,重寫onActivityResult方法,其中包含三個引數,
// 第一個引數表示A活動啟動B活動時的requestCode,第二個引數表示返回資料時的處理結果,
// 第三個引數就是返回的攜帶資料的Intent。所以先對requestCode判斷用來選擇是哪個活動
// 返回的內容,然後再通過對應的resultCode判斷返回的結果處理情況。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode) {
        case 1:
            if (resultCode == RESULT_OK) {
                String value = data.getStringExtra("key_return");
            }
            break;
        default:
    }
}

如果最後是通過Back鍵返回A活動,則可以重寫B活動中的onBackPressed()方法來處理返回資料的操作。