活動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()方法來處理返回資料的操作。