intent

目的,意圖,意義,含義(a.)熱心的,專心致志的

Android intent

在Android來說,intent是常用到的方法,導頁好幫手,主要幫助我們在傳值、轉化畫面等等,像是意圖辦到什麼目的,前往哪個目的地的概念

但除了導頁功能之外,intent能做到的事情不只這些唷,先以導頁做舉例與方法使用說明 …

intent分為兩種:顯式(Explicit intent)和隱式(Implicit intent)。

假設今日我們要從FirstActivity.class轉換到GoalActivity.class

1. 顯示(Explicit)

直接指定確定一個轉換的目標Activity,意圖明顯,所以稱為顯示意圖(Explicit intent)。常用於應用程式內部頁面之間轉換之用。

例如,在FirstActivity.java指定需要轉換到GoalActivity.java,直接在FirstActivity.java正確位置寫上下面程式碼。很多種可替代的寫法,所以選自己習慣的寫法就行囉!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1. 目標Activity可直接以package.class路徑表示。
Intent intent = new Intent(FirstActivity.class,"com.bird.intenttext.GoalActivity")
startActivity(intent);
//2. 目標Activity簡化表示
Intent intent = new Intent(FirstActivity.this, GoalActivity.class)
startActivity(intent);
//3. this 取代 FirstActivity.class
Intent intent = new Intent(this, GoalActivity.class)
startActivity(intent);
//4. setComponent:ComponentName取代
ComponentName CPName = new ComponentName(this, GoalActivity.class);
Intent intent = new Intent();
intent.setComponent(CPName);
startActivity(intent);
//5. setClass:ClassName取代
Intent intent = new Intent();
intent.setClassName(this, GoalActivity.class);
startActivity(intent);

「重要」 最後一定要記得在 AndroidManifest.xml 文件中<application></application> 之中,註冊欲前往的目標Activity。

範例如下

1
2
3
4
5
6
7
8
9
<activity android:name="com.bird.intenttext.GoalActivity"
...>

<intent-filter>
<action .../>
<category .../>
<data .../>
</intent-filter>
<meta-data .../>
</activity>

2. 隱示(Implicit intent)

相對顯示來說,隱示就是間接指定囉!就是讓系统幫你篩選出適合的目標Activity,根據来篩選。透過AndroidManifest.xml文件幫助我們完成這件事情。

舉例來說,在AndroidManifest.xml文件中,註冊欲前往的目標Activity時,將內容修改內容如下:

1
2
3
4
5
6
7
8
<activity
android:name="com.bird.intenttext.GoalActivity">

<intent-filter>
//可自訂android:name字串內容
<action android:name="com.bird.intenttext.GotoGoalActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

在FirstActivity.java指定需要轉換到GoalActivity.java,直接在FirstActivity.java正確位置寫上下面程式碼。

1
2
3
4
5
6
Intent intent = new Intent("GotoGoalActivity");
startActivity(intent);
// or 將Activity定義為Action,使用setAction
Intent intent = new Intent();
intent.setAction("com.bird.intenttext.GotoGoalActivity");
startActivity(intent);
外部轉換

另外,隱示最厲害的地方就是用於與外部應用程式間的Activity轉換,讓
透過設置Action,表明自己的意圖,由系統解析,找到能夠處理這個Intent的Activity並啟動。

例如

"android.intent.action.DIAL": 表示當你有撥打電話的意圖時,系統會呼叫Activity該讓使用者選擇使用。

範例1:表示GoalActivity有撥打電話的功能意圖可被呼叫

1
2
3
4
5
6
7
8
<activity
android:name="com.bird.intenttext.GoalActivity">

<intent-filter>
//可自訂android:name字串內容: 建議將其完整命名package.class
<action android:name="android.intent.action.DIAL"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

範例2:該Activity需呼叫別的意圖功能

1
2
3
Intent intent = new Intent(Intent.ACTION_DIAL);  
// 或者Intent intent = new Intent("android.intent.action.DIAL");
startActivity(intent);

安全機制

有時候會因為AndroidManifest.xml中忘記註冊或字串打錯等原因,找不到對應的Activity,便會拋出ActivityNotFoundException的錯誤訊息,為防止App出錯關閉無法運行,因此我們要設立對應的安全機制。

方法1:try catch

1
2
3
4
5
6
Intent intent = new Intent("GotoGoalActivity");
try{
startActivity(intent);
}catch(ActivityNotFoundException e){
Toast.makeText(this, "找不到对应的Activity", Toast.LENGTH_SHORT).show();
}

方法2:使用Intent的resolveActivity方法判斷這個Intent是否能找到合適的Activity

1
2
3
4
5
6
Intent intent = new Intent(Intent.ACTION_DIAL); 
if(intent.resolveActivity(getPackageManager()) == null)
{
// 设置控件不可用
}
startActivity(intent);

方法3:多個Activity可供選擇的話,則返回的Component是com.android.internal.app.ResolverActivity,也就是用戶選擇Activity的那個界面對應的Activity,這裡不再深究。

1
2
3
4
5
6
7
Intent intent = new Intent(Intent.ACTION_DIAL);  
ComponentName componentName = intent.resolveActivity(getPackageManager());
if(componentName != null)
{
String className = componentName.getClassName();
Toast.makeText(this, className, Toast.LENGTH_SHORT).show();
}
參考來源
  1. Android理解:显式和隐式Intent - 叉叉哥的BLOG - 博客频道 - CSDN.NET
  2. Android Developrs-intent
  3. Android工程師路徑圖的標題職業路徑圖IT職業在線教育平台極客學院