- 顯式Intent:通過指定Intent組件名稱來實現的,它一般用在知道目標組件名稱的前提下,一般是在相同的應用程序內部實現的。
- 隱式Intent:通過Intent Filter來實現的,它一般用在沒有明確指出目標組件名稱的前提下,一般是用於在不同應用程序之間。
一.顯式Intent
一般情況下,一個Android應用程序中需要多個屏幕,即是多個Activity類,並且在這些Activity之間進行切換通過Intent機制來實現的。在同一個應用程序中切換Activity時,我們通常都知道要啟動的Activity具體是哪一個,因此常用顯式的Intent來實現的。
下 面的例子是在同一應用程序中MainActivity啟動SecondActivity,下面的代碼中,主要是為“轉到SecondActivity”按 鈕添加了OnClickListener,使得按鈕被點擊時執行onClick()方法,onClick()方法中則利用了Intent機制,來啟動 SecondActivity,關鍵的代碼是22~25行。
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello1"
- />
- <Button
- android:id="@+id/btn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="轉到SecondActivity"
- />
- </LinearLayout>
second.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello2"
- />
- <Button
- android:id="@+id/secondBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="返回"
- />
- </LinearLayout>
MainActivity.java
- package com.android.test.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- publicclass MainActivity extends Activity {
- private Button btn;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn = (Button)findViewById(R.id.btn);
- //響應按鈕btn事件
- btn.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- //顯示方式聲明Intent,直接啟動SecondActivity
- Intent it = new Intent(MainActivity.this,SecondActivity.class);
- //啟動Activity
- startActivity(it);
- }
- });
- }
- }
SecondActivity.java
- package com.android.test.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- publicclass SecondActivity extends Activity {
- private Button secondBtn;
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.second);
- secondBtn=(Button)findViewById(R.id.secondBtn);
- //響應按鈕secondBtn事件
- secondBtn.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- //顯示方式聲明Intent,直接啟動MainActivity
- Intent intent = new Intent(SecondActivity.this,MainActivity.class);
- //啟動Activity
- startActivity(intent);
- }
- });
- }
- }
AndroidManifest.xml清單文件,16~18行為SecondActivity在清單文件里的聲明
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test.activity"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="10"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activityandroid:name=".SecondActivity"
- android:label="@string/app_name">
- </activity>
- </application>
- </manifest>
效果圖:
二.隱式Intent
下面是同一應用程序中的Activity切換的例子,需要AndroidManifest.xml中增加Activity的聲明,並設置對應的Intent Filter和Action,才能被Android的應用程序框架所匹配。
MainActivity.java
- package com.android.change.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- publicclass MainActivity extends Activity {
- private Button btn;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn = (Button) findViewById(R.id.btn);
- // 響應按鈕btn事件
- btn.setOnClickListener(new OnClickListener() {
- @Override
- publicvoid onClick(View v) {
- // 實例化Intent
- Intent it = new Intent();
- //設置Intent的Action屬性
- it.setAction("com.android.activity.MY_ACTION");
- // 啟動Activity
- startActivity(it);
- }
- });
- }
- }
SecondActivity.java
- package com.android.change.activity;
- import android.app.Activity;
- import android.os.Bundle;
- publicclass SecondActivity extends Activity {
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.second);
- }
- }
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- <Button
- android:id="@+id/btn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="轉到SecondActivity"
- />
- </LinearLayout>
seond.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/second"
- />
- </LinearLayout>
AndroidManifest.xml 文件的18,19行修改了Intent Filter,這樣SecondActivity才能夠接收到MainActivity發送的Intent。因為在MainActivity的 Intent發送的動作為"com.android.activity.MY_ACTION",而在18行里,SecondActivity設置的 Action也為"com.android.activity.MY_ACTION",這樣就能進行匹配。
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.change.activity"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdkandroid:minSdkVersion="10"/>
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activityandroid:name=".SecondActivity">
- <intent-filter>
- <actionandroid:name = "com.android.activity.MY_ACTION"/>
- <categoryandroid:name = "android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
效果圖:
對 於顯示Intent,Android不需要再去做解析,因為目標組件很明確。Android需要解析的是隱式Intent,通過解析,將Intent映射 給可以處理該Intent的Activity,Service等。Intent的解析機制主要是通過查找已經注冊在 AndroidManifest.xml中的所有IntentFilter以及其中定義的Intent,最終找到匹配的Intent。