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 { String className = componentName.getClassName(); Toast.makeText(this, className, Toast.LENGTH_SHORT).show(); }
參考來源
Android理解:显式和隐式Intent - 叉叉哥的BLOG - 博客频道 - CSDN.NET
Android Developrs-intent
Android工程師路徑圖的標題 職業路徑圖IT職業在線教育平台 極客學院