跳到主要內容

Andoird Launcher AIR App

大家好,我是奶綠茶
最近案子的需要,所以會用 Android 和 AIR 來混搭開發 app
遇到的問題有:
1.Android 怎麼啟動另一個 App(Andoird or AIR) ?
2.啟動後,如何帶變數過去?
3.反過來 AIR 啟動 Andoird 且帶值? 
先了解 Android 怎麼啟動另一個 App.
使用 Intent 類別, 且指定要啟動的 app package路徑
Intent intent = new Intent( Intent.ACTION_MAIN , null);
intent.addCategory( Intent.CATEGORY_LAUNCHER);
final ComponentName cn = 
new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary");
intent.setComponent(cn);
startActivity(intent);
如果是要啟動 AIR 的 app. 就要在 package 前加上 air.
new ComponentName("air.com.android.settings", "air.com.android.settings.fuelgauge.PowerUsageSummary"); 
第二個問題是啟動後,如何帶變數過去?
只要在 intent 使用 putExtra 即可 intent.putExtra("Key", "Value");
接收的 Activity 在 onCreate();
使用 getIntent().getExtras().getString("Key");
但在 AIR 的部份,無法修改 onCreate ,所以只好找另外的方法。
好在 Android 的機制裡,可以使用 scheme 的方法呼叫, 像 market:// 這樣,
當遇到這樣的連結時,只要 app 有在 mainfest 設定 intent-filter 的話,就會啟動該 app.
在這我們以:testapp:// 為例 Android 端:
Uri uri = Uri.parse("testapp://com.example/milkmidi/tesetdata");
intent = new Intent( Intent.ACTION_VIEW, uri);
AIR 端:在 application.xml 裡加上 <data android:scheme="testapp" android:host="com.example" /> 當遇到是 testapp://com.example 這樣的連結時,就可以啟動 AIR 的 app.
 <android>
  <manifestAdditions><![CDATA[
   
   <manifest android:installLocation="auto">    
    
    <application> 
     <activity > 
      <intent-filter>
       <action android:name="android.intent.action.MAIN"/>
       <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
      <intent-filter>
       <action android:name="android.intent.action.VIEW"/>
       <category android:name="android.intent.category.BROWSABLE"/>
       <category android:name="android.intent.category.DEFAULT"/>
       <data android:scheme="testapp" android:host="com.example" />
      </intent-filter>
     </activity> 
    </application>     
   
   </manifest>
   
  ]]></manifestAdditions>
 </android>



得到變數可以使用:
NativeApplication.nativeApplication.addEventListener(
     InvokeEvent.INVOKE, onInvoke);
private function onInvoke(e:InvokeEvent):void {
   log( "onInvoke:" + e.arguments );
  }
完成
轉載請註明出處
參考文章:
http://www.riaspace.com/2011/08/defining-custom-url-schemes-for-your-air-mobile-applications
http://stackoverflow.com/questions/5591086/passing-parameters-from-a-java-activity-to-adobe-air-app
http://www.slideshare.net/CodeAndroid/android-intent-intent-filter-broadcast-receivers

留言

竹廿寫道…
奶老師您好
請問如果AIR(2.5)要啟動Andoird的App有什麼方法呢?

我嘗試在Andoird端加入<data android:scheme=....
然後AIR端用navigateToURL去開啟這個自訂的URI,
但會拋出錯誤(SecurityError: Error #2193)。

查詢help的navigateToURL發現一段...
"在 AIR 3 及更新版本中,任何 URI 配置都可以用在要啟動的 URL。"
所以意味著我沒法在AIR2.5使用這個方式吧?

老師能否提供一些建議呢?
milkmidi寫道…
這個我要試一下
那你有試著在 AIR3 裡用過嗎
Unknown寫道…
奶老師您好,
想請問您要如何從AIR App利用URL過程中帶值,
開啟Android App能接收到AIR App傳來的值?
milkmidi寫道…
你是要從 AIR 啟動其他的 App 並帶參數值嗎?
Unknown寫道…
老師是這樣沒錯。
milkmidi寫道…
AIR 要啟動 Android App 的話
1. 該 Android App 是你寫的,因為要需要 mainefest.xml 加入程式
2. 如果是別人寫的,就需要寫 NatvieExtenstion, 用 AIR 呼叫 Android 原生 Code
Unknown寫道…
目前AIR app 跟 Android app能互相開啟,
也能從Android app夾帶uri把值傳到AIR app,
想嘗試從AIR app 帶值傳送到Android app,
不好意思,麻煩奶老師解惑了。

milkmidi寫道…
Android 可以參考這一篇
http://developer.android.com/intl/zh-tw/training/basics/intents/filters.html
Unknown寫道…
感謝奶老師解惑!