學習流程來自《第一行代碼》(第二版)
一個Android應用不可能只有一個活動 活動與活動之間的切換,使用的是Intent。
顯示Intent
主要實現的功能爲:主活動命名爲FirstActivity,點擊Button跳轉到SecondActivity活動。
在FirstActivity中創建一個button1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button_1"
/><!-- id=給當前元素定義一個唯一標識符
layout_width=當前元素的寬度 與父元素一樣寬
layout_height=當前元素的高度 剛好顯示文字
text=元素中顯示的文字內容-->
</LinearLayout> <!--創建的first_layout時候選擇了LinearLayout爲根元素!-->
在AndroidManifest.xml中註冊FirstActivity和SecondAndroid頁面
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yezhou.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter> <!-- 不是主活動不需要配置 -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>
</application>
</manifest>
利用FirstActivity中button的鼠標點擊事件來打開SecondActivity 這裏就要用到Intent。
Intent有很多個構造參數,比較簡單的是Intent(Context packageContext, Class cls),第一個參數指的是 提供一個啓動活動的上下文,也就是當前的java文件FirstActivity.this,第二個就是要跳轉的活動,這裏是SecondActivity.class。專門用於啓動活動的方法爲startActivity(),傳入已經創建好的Intent對象即可。
Button button1 = (Button) findViewById(R.id.button_1); // 找到定義元素
button1.setOnClickListener(new View.OnClickListener() { // 爲Button1註冊一個監聽器
@Override
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class); // 啓動活動的上下文,要啓動活動的class
startActivity(intent); // 啓動活動 !--顯式Intent
}
}
這時運行虛擬機,點擊button就可以跳轉到SecondActivity。
隱式Intent
不明確指定由哪個Activity去響應FirstActivity裏的按鈕點擊事件。
(爲了更好的理解可以創建一個ThirdActivity,由它去響應此事件)
先在AndroidManifest.xml中對三個Activity進行註冊:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yezhou.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter> <!-- 不是主活動不需要配置 -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="com.example.yezhou.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" /> <!-- 只有<action><category>同時匹配上Intent中指定的action和category時這個活動才能響應該Intent -->
</intent-filter>
</activity>
</application>
</manifest>
修改FirstActivity中button的點擊事件
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
Intent intent = new Intent("com.example.yezhou.activitytest.ACTION_START");
startActivity(intent); // 自動將默認category添加
}
}
運行,這時你會發現點擊按鈕打開的是ThirdActivity
應爲對ThirdActivity的註冊中category屬性爲
<category android:name="android.intent.category.DEFAULT" />
這是一種默認的category,在調用startActivity()方法時會自動將其添加。
可以在AndroidManifest.xml文件中修改SecondActivity的註冊文件:
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.yezhou.activitytest.ACTION_START" />
<category android:name="com.example.yezhou.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
接着在button的點擊事件中
Button button1 = (Button) findViewById(R.id.button_1); // 找到定義元素
button1.setOnClickListener(new View.OnClickListener() { // 爲Button1註冊一個監聽器
@Override
public void onClick(View v){
Intent intent = new Intent("com.example.yezhou.activitytest.ACTION_START");
intent.addCategory("com.example.yezhou.activitytest.MY_CATEGORY"); // 添加一個指定的category值
startActivity(intent);
}
}
運行,這時SecondActivity會來響應我們的點擊事件,因爲只有SecondActivity的action,category的值才能與button中指定的對得上號,所以由SecondActiviy來隱式響應。
有的時候我們還會調用其他的軟件來響應接下去的事件,比如說打開一個網頁這時只要修改FirstActivity.java中button的點擊事件即可。
Button button1 = (Button)findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
}
調用系統的瀏覽器來打開百度。
不僅如此還可以響應別的軟件的網頁請求
在AndroidManifest.xml中的intent-filteri標籤的data屬性設置要用來響應其他軟件Intent的http協議。
這裏我們來實現點擊FirstActivity中的button由SecondActivity來響應它。
在AndroidManifest.xml中SecondActivity的標籤裏面加上
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<data android:scheme="http" />
</intent-filter>
這時我們運行程序,點擊button
我們會發現TWO來響應我們http的請求了。
除了http協議外還可以指定很多其他協議
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:10000"));
startActivity(intent);
}
}
響應一個data uri爲http的activity geo表示地理位置 tel表示撥打電話
傳遞數據的活動切換
向下一個活動傳遞參數
在button的點擊事件中
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data","Hello SecondActivity"); // 傳遞一個值給下一個activity
startActivity(intent); // 啓動活動
“extra_data”是鍵,而後面那個參數是值
在SecondActivity頁面來輸出“Hello SecondActivity”
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
Log.d("SecondActivity",intent.getStringExtra("extra_data")); // 顯示上一個活動傳遞進來的值
返回數據給上一個活動
有了向下傳遞那麼也必定有向上傳遞
在FirstActivity中修改button打開SecondActivity 的方式
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1); // 期望在活動銷燬時能夠返回一個結果給上一個活動 由於 SecondActivity是用此方法啓動的,所以被銷燬之後會回調上一個活動的onActivityResult方法,所以需要重寫此方法
startActivity(intent); // 啓動活動
使用startActivityForResult()方法來啓動SecondActivity,請求碼只要是一個唯一的值即可。
在SecondActivity活動中添加一個button
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity"); // 需要傳遞的數據
setResult(RESULT_OK,intent); // 用於向上一個activity返回數據的
finish();
}
}
雖然我們還是創建了一個Intent,但是這個intent並沒有明確指定,點擊了button後該切換到哪個界面。
這裏的intent僅用於傳遞數據,調用setResult()方法 第一個參數用於向上一個活動返回處理結果,一般RESULT_OK或RESULT_CANCELED,第二個參數則把帶有數據的 intent傳遞回去。finish()方法來銷燬當前活動。
應爲FirstActivity是被回掉的對象,那麼需要重寫它的onActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK)
Log.d("FirstActivity",data.getStringExtra("data_return"));
break;
default:
}
}
第一個參數就是我們在啓動那個被銷燬的活動時傳入的請求碼(判斷數據來源),第二個參數即是在SecondActivity返回數據時的處理結果(是否成功),第三個參數就是intent。
運行先點擊button來到SecondActivity,接着點擊SecondActivity中的button
可以看到FirstActivity成功的接收到了SecondActivity傳遞的值。
但如果用戶是在SecondActivity直接點擊了back鍵來返回FirstActivity的需要重寫SecondActivity中的onBackPressde()方法
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK);
finish();
}
此博文爲個人學習筆記,僅供個人學習使用,希望對大家有幫助。