TensorFlow on Android (I)


AndroidManifest.xml
裡頭定義了 application 的名稱、圖示、 activity,像是:

<application android:allowBackup="true"
    android:debuggable="true"
    android:label="@string/app_name"
    android:icon="@drawable/ic_launcher"
    android:theme="@style/MaterialTheme">

    <activity android:name="org.tensorflow.demo.ClassifierActivity"
              android:screenOrientation="portrait"
              android:label="@string/activity_name_classification">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Intent (意圖)

## 代表使用者與應用程式的互動,是可用來向另一個應用程式元件要求動作的傳訊物件
例如:按下一個圖示之後撥出電話、或是按下一個按鈕之後轉換到另一個頁面 (另一個 activity)。

## Intent 有三個基本的使用案例

- 如何啟動 Activity
  Activity 代表應用程式中的單一畫面。
  startActivityIntent()、startActivityForResult()、onActivityResult()...
- 如何啟動 Service
  Service 是可以在背景中執行操作的元件,但沒有使用者元件。
  startService(Intent)、bindService()...
- 如何傳送 Broadcast
  Broadcast 是指任何應用程式都可以接受的訊息。
  sendBroadcast(Intent)、sendOrderedBroadcast(Intent, String)、sendStickyBroadcast()...

## Intent 分成兩種類型

- 明確意圖 (或顯式 Intent)
  再建構 Intent 時就指定 activity 接收者,通常使用在相同的應用程式內部,即啟動應用程式中的元件時。

- 隱含意圖 (或隱式 Intent)
  不指定特定的 activity ,而是宣告要執行的一般動作,讓另一個應用程式的原件來處理它,這樣的做法有利於降低發送者跟接收者之間的耦合性,通常適用於不同的應用程式之間。

Intent-filter (意圖過濾器)

當隱含意圖(Intent) 發出時,系統會根據 Intent filter 篩選出合適的 activity 並啟動;
若元件沒有設定 intent filter ,就只能接受到有明確指定 component 的 intent。

Android 是透過 Intent 的 action、data、category 這三個屬性來進行匹配判斷的。而一個 filter list 中的 action、data、category 可以同時有多個。

- action 的匹配規則
  若 Intent object 沒有指定 Action,則這個比對就 pass。
  Intent filter 內至少要有一項 Action,否則將沒有任何 Intent 可以通過這個 filter。

  action 的 filter 可以有很多個,intent object 只要符合其中一個即可。

  一個 application 下可以定義多個 activity,而每個 activity 的層級都是相同的。
  那麼,該如何決定先啟動哪一個 activity 呢?
  android.intent.action.MAIN      決定最先啟動的 Activity

- category 的匹配規則
  Intent object 預設會有一個 category 為  android.intent.category.DEFAULT
  category 的 filter 可以有很多個,intent object 必須全部符合才算 pass。

  android.intent.category.LAUNCHER 決定應用程式是否顯示在程式列表 (手機桌面) 中
  如果 activity 有聲明了 android.intent.action.MAIN 但沒有聲明 android.intent.category.LAUNCHER ,則系統會報錯誤訊息,故兩個要同時聲明才會有意義。
  而如果有多個 activity 都定義了 MAIN 和 LAUNCHER 則應用程式會出現多個圖示。

- data 的匹配規則
  data 包含 mimeType(媒體類型或文件類型) 和 URI 兩個部分。

<data android:mimeType="image/png"
    android:host="www.myhost.com"
    android:path="myfolder/subfolder/xxx.png"
    android:port="2018"
    android:scheme="http" />

  data 的 filter 可以有很多個,intent object 只要符合其中一個即可。

-------------------------------------------------- 2018/10/01更新 --------------------------------------------------

留言

這個網誌中的熱門文章

eclipse 建立 Dynamic Web Project