В эти выходные я читал письмо по телефону, когда заметил что-то странное. Ссылка на статью в Википедии побудила меня спросить, хочу ли я загрузить ее в своем браузере или в приложении Википедии. Зная, что приложение Wikipedia было создано с помощью PhoneGap , я решил разобраться в этом и посмотреть, как это было сделано.
Я провел некоторое исследование и обнаружил, что (насколько я могу судить) приложение Wikipedia использует функцию Android под названием Intents . Насколько я понимаю, Intents — это способ для приложений …
- Передайте общий запрос — то есть: «У меня есть адрес, и я хотел бы, чтобы кто-то сделал что-то необычное с ним!»
- Прислушайтесь к общим просьбам — то есть: «Чувак, я могу делать потрясающие вещи с картами. Если у тебя есть адрес, дай мне знать, потому что я так сделаю с ним что-нибудь удивительное. Прекрасно».
Оказывается, для этого уже есть плагин: WebIntent . Чтобы использовать этот плагин, вы должны немного изменить код Java (я забыл добавить его в закладки, но здесь кто-то предоставил помощь), чтобы поддержать последнюю версию PhoneGap. Я включил копию в свою запись в блоге, поэтому не стесняйтесь просто скопировать ее оттуда. Но как только у вас установлен плагин, вы можете выполнить одно (или оба) из вышеуказанных действий.
Создать намерение так же просто, как использовать немного JavaScript:
window.plugins.webintent.startActivity({ action: WebIntent.ACTION_VIEW, url: 'geo:0,0?q=' + 'new york'}, function() {}, function(e) {alert('Failed to open URL via Android Intent');} );
Но чтобы заставить ваше приложение прислушиваться к цели, требуется немного больше работы, в частности, изменение файла AndroidManifest.xml. Вам нужно добавить немного XML в это, чтобы зарегистрировать намерение, а также использовать JavaScript в вашем приложении, чтобы заметить, когда ваше приложение было запущено.
Через Stackoverflow я нашел эту запись при прослушивании ссылок на Youtube, а затем добавил ее в свой AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.camden.intenttest" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:resizeable="true" android:anyDensity="true" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <application android:label="@string/app_name" > <activity android:name="IntentTest" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <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"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:host="www.youtube.com" android:scheme="http"></data> </intent-filter> </activity> <activity android:name="org.apache.cordova.DroidGap" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <intent-filter></intent-filter> </activity> </application> </manifest>
А потом я использовал немного JavaScript, чтобы заметить намерение.
<!DOCTYPE html> <html> <head> <script src="cordova-1.6.1.js"></script> <script src="webintent.js"></script> <script> function init() { document.addEventListener("deviceready",deviceReady,false); } function deviceReady() { console.log("Device Ready"); window.plugins.webintent.getUri(function(url) { if(url !== "") { // url is the url the intent was launched with document.querySelector("#test").innerHTML = "URL was "+url; } }); } </script> </head> <body onload="init()"> <h1>Test</h1> <div id="test"></div> </body> </html>
Просто, правда? После установки приложения я быстро открыл HTML-страницу с двумя ссылками. Один указывает на мой блог, другой на случайное видео на Youtube .
Когда я нажимаю ссылку на Youtube, я получаю это:
и если я выбираю свое собственное приложение, JavaScript, который я написал, замечает и отвечает на вызов:
Довольно просто! Я действительно едва затронул всю мощь и охват Intents, и я понятия не имею, существует ли что-то подобное для iOS (конечно, это должно быть), но в целом это невероятно легко использовать с PhoneGap.