Фильтр намерений Android PhoneGap, браузер перезванивает запущенному приложению?

У меня есть Android-приложение на базе Cordova/PhoneGap 2.0, и я пытаюсь использовать фильтры намерений для регистрации пользовательского обработчика протокола.

Таким образом, мое приложение PhoneGap запускается, делает свое дело, а затем обращается к приложению браузера на удаленную веб-страницу (через navigator.app.loadUrl('http://example.com/') или window.open('http://example.com/')). Ссылка на этой удаленной веб-странице в браузере (myprotocol://do/stuff) вернет мое приложение обратно на передний план через фильтр намерений для схемы данных, а через плагин WebIntents я могу получить и проанализировать этот URL-адрес в своем приложении.

Это работает в Android 4.0.4 на HTC One X (и, следовательно, в версии Android «Sense»).

Тот же код не работает на Android 4.0.4 или 4.1.1 на Galaxy Nexus или 4.0.1 на Nexus S.

Странная проблема, которую я вижу на «стандартном» Android, заключается в том, что при срабатывании фильтра намерений он запускает новое представление приложения и В браузере Android. Я вижу, что он перезагружает html-страницу. Он не выводит существующий экземпляр приложения на передний план, как ожидалось. Глядя на logcat, я вижу, что на самом деле это тот же процесс I/Web Console, но он снова загружает html. Нет нового журнала «Start proc».

И, как ни странно, теперь у меня есть два экземпляра моего приложения, отображаемые в диспетчере задач. Исходный экземпляр приложения все еще там с моим пользовательским значком приложения. И процесс браузера имеет свой собственный значок приложения браузера, но явно запускает пользовательский интерфейс моего приложения. Я могу переключаться и взаимодействовать с каждым веб-просмотром индивидуально. Это похоже на то, что мой процесс теперь имеет два веб-представления: одно в приложении, а второе веб-представление теперь выполняется в процессе браузера.

В настоящее время у меня есть что-то вроде этого в 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.

Я также вижу через журнал, что для HTC DroidGap.onCreate() не вызывается, когда срабатывает намерение, но на Nexus это происходит.

Я делаю что-то неправильно, подключая фильтр намерений таким образом?

Как я могу вызвать вызов существующего экземпляра приложения вместо нового в браузере на стандартном Android 4.x?


person Ryan Watkins    schedule 07.09.2012    source источник


Ответы (1)


Использование android:launchMode="singleTask" вместо android:launchMode="singleTop" для действия решило эту проблему для моего сценария.

Похоже, что HTC просто обрабатывает это иначе, чем Android по умолчанию.

Чтение http://developer.android.com/guide/components/tasks-and-back-stack.html и просмотр того, как, например, приложение Google Play Store запускается браузером (в браузере, в списке задач) на стандартном Android указывает поведение, которое я видел, было задумано, хотя и немного сбивало с толку.

У меня есть только одно действие, и я намерен использовать только один экземпляр моего приложения, поэтому «singleTask» здесь решил проблему.

person Ryan Watkins    schedule 28.09.2012
comment
У меня была такая же проблема, и это решило ее и для меня, так что спасибо. Могу я спросить: есть ли причина, по которой вы выбрали singleTask вместо singleInstance? Оба, кажется, работают для меня. - person jackocnr; 17.01.2014
comment
singleTask у меня работает для запуска, но данные, кажется, передаются обратно в приложение (GoogNexus, KitKat) - person ericpeters0n; 25.05.2014