У меня есть 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?