實作Android裡利用Intent呼叫其他程式

這次的案子想要實作從A程式呼叫B程式的其中一個class。
以下介紹如何使用Intent來進行呼叫。


Intent分兩種,一種叫做明示(Explicit) ,另一種叫暗默(Implicit),不知道台灣的要怎麼稱呼所以我就暫且用日文的稱呼法。

假設目前在A程式下要打開B程式的 C-class

明示Intent要使用的前提必須要知道B程式的PackageName,而且也要知道C-class的名稱,才可以指定開啟。
(PackageName取用方法請服用)

暗默Intent則是不需要知道任何東西,只要講class名就好,Android會自動幫你找合適的開啟程式。

很複雜?
這樣想好了:

假設今天一個班裡面不會出現同名同姓的兩個人。
我今天要找一年二班的王小明,我可以直接跑去廣播說「我找一年二班王小明」
這樣子規定了班級(PackageName)跟名字(Class)的情況下,就可以直接找得到我要的人。
這就叫明示。

我今天廣播「我要找王小明」。
這個時候整個學校(Android系統)裡面的所有叫做王小明(Class)的人都會出列,然後直接讓我選擇要找哪一個王小明。
這就叫暗默。

很粗略的解釋,不過大概是這樣的概念,有錯誤還請指正。

明示Intent用法很直接,只要在A程式下面下這一行就可以了

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.testApp","com.example.testApp.MainActivity" ));
startActivity(intent);


使用暗默Intent的前提下,B程式必須先在AndroidManifest.xml下面多加上Intent-filter,並且設為default才能給其他程式取用

<manifest package="com.example.testApp" xmlns:android="http://schemas.android.com/apk/res/android">
 
    <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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN">
                <category android:name="android.intent.category.LAUNCHER">
            </category></action></intent-filter>
 <!-- 加上這行 -->
            <intent-filter>
                <action android:name="com.example.testApp">
                <category android:name="android.intent.category.DEFAULT">
            </category></action></intent-filter>
 <!-- 加上這行 -->
        </activity>
    </application>
</manifest>


然後在A程式下面下這個指令就可以了:
Intent intent = new Intent();
intent.setAction("com.example.testApp");
startActivity(intent);


留言

這個網誌中的熱門文章

利用Accuweather實作天氣APP

實作Android導覽教學(fragment)