Блог Андрея

 
 

Как создать android приложение на php (+ html + js + css)

Статья адресована людям, занимающимся разработкой на PHP, у которых возникла необходимость по быстрому сделать android-приложение для личного пользования.

Прежде всего хочется обратиться к профессиональным разработчикам android-приложений и к людям не занимающимся вообще никакой разработкой.

Это НЕ статья о том как профессионально разрабатывать android приложения. Если вы не профессионал и ничего не знаете о профессиональной разработке android приложений, но хотите им стать, вам не надо это читать.

Если вы профессиональный разработчик android приложений, вы не найдёте здесь ничего интересного.

Приложение может стать вполне рабочим, например вот это в Google Play опубликовано без проблем. (Скачиваний маловато, но я не задавался целью раскрутить приложение, я создал его для своих нужд, а ссылка на маркете позволяет легко им делиться с друзьями).

Наверное, невозможно найти разработчика на PHP, который категорически не смог бы сверстать в HTML требуемый ему интерфейс, оживить его с помощью javascript и придать нужный ему вид с помощью css.

Не все из нас смогут сделать то же самое работая на заказ, требования к фронтенду современных продакшен сайтов могут оказаться трудновыполнимыми, а порой и вообще непонятными.

С другой стороны, когда нам нужен какой-то web-интерфейс для личного пользования, мы с лёгкостью его реализуем используя весь этот html/js/css так, как будто мы всю жизнь только фронтендом и занимались.

Думаю, ни для кого не секрет, что можно сделать android приложение c webView и поместить в него ваш HTML5 интерфейс, но как взаимодействовать с устройством?

Взаимодействие с устройством осуществляется добавлением программного интерфейса в виде объекта javascript. Вызывая методы этого объекта программист может из webView взаимодействовать например с файловой системой устройства, делать в принципе всё, что позволяют методы этого объекта, реализованные на языке Java.

Мне, как человеку много лет кодившим на php и иногда на javascript показалось очень удобным иметь в своём js коде объект с именем PHP и обеспечивающим как можно большее количество php функций, вызывая которые я мог бы например работать с файлами устройства, оперировать функцией date и другими.

Конечно, реализовать все PHP функции маловероятно, но мне это и не надо, буду добавлять по мере необходимости.

Сейчас реализованы вот такие функции ссылка на исходный код PHPInterface

Репозиторий на гитхаб в котором этот класс будет время от времени обновляться и совершенствоваться.

Как подтверждение, что это вполне жизнеспособная библиотека вот исходный код android приложения опубликованного на маркете.

Ниже описаны особенности реализованых методов (если метод работает полностью совместимо с стандартной функцийе php его нет в этой таблице).

Метод Особенности
file_get_contents На данным момент принимает только короткие имена файлов (например "file.txt"). Созданный файл будет доступен только тому приложению, которое его создало. Планируется в дальнейшем поддержка полных имён файлов, например "/mnt/sdcard/app/data/file.txt".
file_exists См. file_get_contents
file_put_contents См. file_get_contents. Также, надо иметь ввиду, что при использовании констант, например FILE_APPEND, нужно использовать PHPInterface.FILE_APPEND;
str_replace( String search, String replace, String subject, boolean getCount) В отличии от оргигнальной php функции, если нам нужно количество замен, мы не передаём переменную по ссылке, а указываем вместо неё true. Тогда PHPInterface.STR_REPLACE_COUNT будет содержать количество замен после вызова метода.
in_array(needle, haystack) Пока работает только с массивами строк и целых чисел (long и int)
strval Пока работает только с аргументами типа long и int
count Не работает с простыми типами java (такими как long и int), только с теми, которые наследуются от Object

Список методов, реализванных на 2019-05-30

  • Методы PHPInterface
  • count
  • date
  • file_get_contents
  • file_exists
  • file_put_contents
  • in_array
  • intval
  • str_replace
  • strlen
  • strval
  • time

Примеры использования в java коде:


public class MainActivity extends Activity{
	
	public PHPInterface PHP;
	
	public void foo() {
		PHP = new PHPInterface(this.getApplicationContext());
		long currentTimestamp = PHP.time();
	}
}
						

или, если нужен при работе приложения в фоне:


public class ServiceDM extends Service{
	
	public PHPInterface PHP;
	
	public void foo() {
		PHP = new PHPInterface(this);
		long currentTimestamp = PHP.time();
	}
}
						

Пример использования в javascript коде:


//Практически в любом месте js загруженного в webView
var currentTimestamp = PHP.time();
PHP.file_put_contents('time_of_start.txt', currentTimestamp);