4

Cordova/PhoneGap 2.0 ベースの Android アプリケーションがあり、インテント フィルターを使用してカスタム プロトコル ハンドラーを登録しようとしています。

したがって、私の PhoneGap アプリが起動し、その処理を実行し、後でブラウザ アプリをリモート Web ページに呼び出します (navigator.app.loadUrl('http://example.com/')またはを介し​​て) window.open('http://example.com/'))。ブラウザのそのリモート Web ページのリンク ( myprotocol://do/stuff) は、アプリをフォアグラウンドに戻します。データ スキームのインテント フィルターと、WebIntents プラグインを介して、アプリでこの URL を取得して解析できます。

これは、HTC One X の Android 4.0.4 (したがって、Android の「Sense」バージョン) で機能します。

同じコードは、Galaxy Nexus の Android 4.0.4 または 4.1.1、または Nexus S の 4.0.1 では機能しません。

「ストック」Android で見られる奇妙な問題は、intent-filter がトリガーされている間、アプリの新しいビューを起動し Android ブラウザーで起動することです。HTMLページがリロードされていることがわかります。既存のアプリ インスタンスが期待どおりにフォアグラウンドに表示されません。logcat を見ると、これは実際には同じ I/Web コンソール プロセスであることがわかりますが、html が再度読み込まれています。「Start proc」の新しいログはありません。

奇妙なことに、タスク マネージャーにアプリの 2 つのインスタンスが表示されるようになりました。元のアプリ インスタンスは、カスタム アプリ アイコンと共にまだ存在しています。また、ブラウザ プロセスには独自のブラウザ アプリ アイコンがありますが、明らかにアプリ UI を実行しています。各 Web ビューを個別に切り替えて操作できます。私のプロセスには 2 つの Web ビューがあり、1 つはアプリ内にあり、もう 1 つはブラウザ プロセスで実行されているようです。

現在、AndroidManifest.xml に次のようなものがあります。

<activity android:name="MyApp" android:label="@string/app_name" 
          android:screenOrientation="portrait"
          android:launchMode="singleTop"
          android:configChanges="orientation|keyboardHidden">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>
      <data android:scheme="myprotocol" />
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</activity>

私のアプリは WebIntents プラグインと NFC プラグインを使用していますが、それらがなくても同じ問題が発生します。この問題は、PhoneGap 1.8.1 および 1.9.0 でも再現しました。

DroidGap.onCreate()HTC の場合、インテントがトリガーされたときに呼び出されないことをログから確認することもできますが、Nexus では呼び出されます。

このようにインテントフィルターを接続する際に何か間違ったことをしていますか?

ストック Android 4.x で、ブラウザーで新しいアプリ インスタンスを呼び出す代わりに、既存のアプリ インスタンスをトリガーするにはどうすればよいですか?

4

1 に答える 1

4

私のシナリオでは、アクティビティandroid:launchMode="singleTask"ではなくを使用してこれを解決しました。android:launchMode="singleTop"

HTCは、デフォルトのAndroidとは異なる方法でこれを処理しているようです。

http://developer.android.com/guide/components/tasks-and-back-stack.htmlを読ん で、たとえばGoogle Playストアアプリがブラウザ(ブラウザのタスクリスト)によってどのように起動されるかを確認ます。在庫のAndroidは、少し混乱するかもしれませんが、私が見た動作が意図されたものであることを示しています。

アクティビティは1つだけで、アプリのインスタンスは1つだけにするつもりなので、ここでの「singleTask」で問題を解決しました。

于 2012-09-28T16:15:19.743 に答える