Перейти к содержанию
Andrey Efimov

[Статья][Android] Автозапуск службы после рестарта ОС

Рекомендуемые сообщения

Ссылка: http://delphifmandroid.blogspot.ru/2016/01/ansroidservicebroadcastreceiver.html

Автор: Ефимов Андрей

Описание: [AndroidService+BroadcastReceiver] Автозапуск службы после рестарта ОС

 

p.s. Тему почистил

Поделиться сообщением


Ссылка на сообщение

Все что угодно перепробывал не создается файл test_class.dex

Windows 10, Delphi X Seattle,jdk1.8.0_66

 

 я думаю ошибка тут:

call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\output\jar\test_classes.jar
 
что делать?
 
 
post-1783-0-74990700-1457030359_thumb.pn
Отредактировал fsdb

Поделиться сообщением


Ссылка на сообщение

решение:

меняем на java -jar  что бы понять что случилось - далее в гугл и..  делаем Downgrade jdk

Отредактировал fsdb

Поделиться сообщением


Ссылка на сообщение

Все равно не смог по статье повторить. прошу помочь и поправьте меня

 

в манифесте добавил

 <receiver android:name="com.PanelControlReceiver.BootCompletedReceiver"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
                  android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
 
в яве файле написал,  запустил батник. все файлы создались.
package com.PanelControlReceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootCompletedReceiver extends BroadcastReceiver {

 public void onReceive(Context context, Intent intent) {

  if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
   Intent TestLauncher = new Intent();
            TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService");
   context.startService(TestLauncher);
  }


 }
  
}
 
 
сервис запускаю так, он запускается, когда приложение закрываю - вижу что сервис дальше работает. после перезагрузки не стартует сервис заново
ServiceHandle:=TLocalServiceConnection.Create;
ServiceHandle.StartService('PanelControlService');
ServiceHandle.Free;
 
 
замену  класса сделал. вот скрин https://yadi.sk/i/FbVOPXOSpv3Qs
 
 
права дал приложению . https://yadi.sk/i/WwAwCWEypv3iB
 надо ли давать права такие же сервису?
 
Отредактировал Andrey Efimov

Поделиться сообщением


Ссылка на сообщение

Сервису права не нужно давать. В статье, написано всё, что необходимо сделать.

Ошибки вываливаются?

Файл classes.dex правильно сгенерили?

Вот так, примерно:

1. Добавляем сервис в приложение, даём права, делаем сборку

2. Вносим изменения в манифест, делаем сборку,

3. В батнике меняем путь до нового classes.dex из сборки(2 шаг), генерим

4. Заменяем classes.dex на файл из 3 шага

 

С виду, по тем данным, что вы привели, всё нормально.

 

Ещё проверьте, есть ли в конечном манифесте зарегистрированный ресейвер.

 

 

p.s. Используйте тег "Код" для кода в сообщениях.

Поделиться сообщением


Ссылка на сообщение

Andrey Efimov

спасибо что ответили, ошибок не получаю.
 
пути в бат файле
if x%ANDROID% == x set ANDROID=C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\
set ANDROID_PLATFORM=%ANDROID%\platforms\android-22
set DX_LIB=%ANDROID%\build-tools\22.0.1\lib
set EMBO_DEX="C:\DB\eHomeSmartMobile\eHSforAndroid\Application\Android\Debug\classes.dex"
set PROJ_DIR=%CD%
set VERBOSE=0

если удалить папку output то она каждый раз создается заново с файлами test_classes.dex, classes.dex, BootCompletedReceiver.class,test_classes.jar

 

Скриншот конечного манифеста

https://yadi.sk/i/EreQmlmtpvE7h

 

 

Очень хотелось бы реализовать это по Вашей статье... 

 

 

 

у меня с сервисами вообще какая то большая проблема. ниразу не удалось Остановить работу по breakpoint в внутри сервиса. я перечитал форум и у одного формутчанина тоже так не работало - даже тут не работает дебагер

м.б. проблема в этом как раз......


uses Androidapi.JNI.App;

function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
Result := TJService.JavaClass.START_STICKY;
end;

В  стандартных Samples где есть примеры по сервисам -  тоже нигде не останавливается по breakpoint

порекомендуйте пожалуйста что нибудь для решения проблемы

Отредактировал fsdb

Поделиться сообщением


Ссылка на сообщение

К сожалению, мне сложновато судить по частичным данным. Если хотите, скиньте исходники в личку, я постараюсь найти проблему. Если не хотите скидывать исходники, скиньте апк, проверю, также будет или нет.

Кстати, автозапуск происходит не сразу, т.е. нужно подождать, пока система запустит сервис.

 

То, что файлы создаются, ещё не значит, что они правильные.

 

Это не конечный манифест, это шаблон манифеста для RAD Studio, по нему создаётся промежуточный и уже потом конечный.

промежуточный лежит в папке - ProjectAutoStartService\App\Android\Debug

конечный - C:\Users\Infocean\Desktop\ProjectAutoStartService\App\Android\Debug\ServiceApp\bin\*.apk\AndroidManifest.xml

 

посмотрите, есть ли упоминание в промежуточном манифесте.

 

с отладкой сервисов, у всех, похоже, беда...

 

 

Я сталкивался с двумя причинами, из-за которых не происходил автозапуск (без ошибок):

1) В манифесте не прописывался ресейвер

2) classes.dex не правильно клеился

 

p.s. А проект из статьи нормально стартует?

Поделиться сообщением


Ссылка на сообщение
 
Ваш проект прекрасно запускается после растарта системы
 
Насколько я понял упоминание есть в манифестах:
 
Промежуточный:
 
Конечный: 
 
Вероятно вторая причина. classes.dex не правильно клеился или формируется. Хотелось бы узнать причину. Как понять, что файлы формируются не верные.
 
Исходный код я скинул в личку. 
Спасибо!!!!
Отредактировал fsdb

Поделиться сообщением


Ссылка на сообщение

Огромное спасибо.я очень доволен. Напишу для всех пост. м.б. кому пригодится

 

 

неправильно указали имя пакета для java класса, т.е. если указано

com.PanelControlReceiver

то и сам java файл должен лежать в папке eHSforAndroid\Application\java\src\com\PanelControlReceiver\

Поделиться сообщением


Ссылка на сообщение
В 3/3/2016 в 20:36, fsdb сказал:

Все что угодно перепробывал не создается файл test_class.dex

Windows 10, Delphi X Seattle,jdk1.8.0_66

 

 я думаю ошибка тут:

call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\output\jar\test_classes.jar
 
что делать?
 
 
2016-03-03 23-37-26 Выбрать Администратор  Командная строка - build.bat.png

 

Привет. Точно такая же проблема. Можно уточнить что означает фраза 

"меняем на java -jar  что бы понять что случилось - далее в гугл и..  делаем Downgrade jdk"

Что конкретно поменять на java -jar?

Спасибо

Отредактировал ENRGY

Поделиться сообщением


Ссылка на сообщение
14 минут назад, ENRGY сказал:

 

Привет. Точно такая же проблема. Можно уточнить что означает фраза 

"меняем на java -jar  что бы понять что случилось - далее в гугл и..  делаем Downgrade jdk"

Что конкретно поменять на java -jar?

 

Спасибо

1) Откройте bat файл

2) найдите строку, которая начинается на "javac" (примерно 19)

если файл из статьи, то выглядит вот так:

javac %VERBOSE_FLAG% -Xlint:deprecation и т.д.

замените на

javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation

Если не получится, то замените цифры на 1.6. (т.е. вам надо добавить -source 1.7 -target 1.7 сразу после javac)

3) Отпишитесь о результате.

 

Поделиться сообщением


Ссылка на сообщение

To Андрей

В обоих случаях пишет 

c:\Projects\MyProj\Java>javac -source 1.6 -target 1.6  -Xlint:deprecation -cp c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows\platforms\android-24\android.jar -d output\classes src\TestClassHello\HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning

Я указал путь Java 1.8 (там только 2 папки с названием jdk1.8.0_60 и jre1.8.0_60 с другими версиями нету), насколько я понял эта Java поставилась с Delphi Berlin. Может мне нужно скачать другую версию Java ? 

Отредактировал ENRGY

Поделиться сообщением


Ссылка на сообщение

 у меня была проблема с явой. потом открыл гугл и оказывается именно с этой версией ничего не получалось. скачал другую

Поделиться сообщением


Ссылка на сообщение
javac

заменил на java -jar вроде бы и получил подробней текст ошибки. я могу ошибаться. уже не помню деталей

Поделиться сообщением


Ссылка на сообщение

А вот ещё, проверьте, файл classes.dex от приложения вы сгенерили? А то он у вас пишет, что не может найти его...

15 минут назад, fsdb сказал:

 у меня была проблема с явой. потом открыл гугл и оказывается именно с этой версией ничего не получалось. скачал другую

Да, там с версиями косяк какой-то, уже далеко не первый раз пишут мне с такой проблемой, но пока всем помогало добавление строки "-source 1.7 -target 1.7". Причём ошибки у всех разные, но эта магическая строчка спасает :)

Поделиться сообщением


Ссылка на сообщение

А вот еще такой вопрос, в эту же тему. Сейчас пока не надо, но чтобы знать.

Если нужно сделать автозапуск службы после рестарта ОС, как в статье, и одновременно с этим  Автозапуск приложения в назначенное время или добавить еще какой то Java класс, то ведь получиться 2 файла classes.dex? Как их объединить?

Я  так понял по идее нужно взять первый сгенерированный файл classes.dex (от первой статьи), отложить его в другую папку и указать его путь вместо set EMBO_DEX="c:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release\classes.dex" ? И на основе него сгенерить второй файл DEX (от второй статьи)?

Отредактировал ENRGY

Поделиться сообщением


Ссылка на сообщение
3 часа назад, ENRGY сказал:

А вот еще такой вопрос, в эту же тему. Сейчас пока не надо, но чтобы знать.

Если нужно сделать автозапуск службы после рестарта ОС, как в статье, и одновременно с этим  Автозапуск приложения в назначенное время или добавить еще какой то Java класс, то ведь получиться 2 файла classes.dex? Как их объединить?

Я  так понял по идее нужно взять первый сгенерированный файл classes.dex (от первой статьи), отложить его в другую папку и указать его путь вместо set EMBO_DEX="c:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release\classes.dex" ? И на основе него сгенерить второй файл DEX (от второй статьи)?

Получится один classes.dex.

Такой задачи у меня ещё не было, поэтому только теория:

Варианты:

1) Пишем два класса, наследника от BroadcastReceiver. Прописываем в манифесте, один будет реагировать на перезагрузку, другой на время. По очереди, клеим к основному файлу classes.dex от приложения. Т.е. приклеили 1 раз, у нас получился 1 classes.dex, далее клеим к нему след. класс.

2) Пишем один класс, который будет отрабатывать за два. Суть в том, чтобы отслеживать Action внутри OnReceive. Клеим его, а вот генерация интента уже будет отличаться.

 

Это в теории :).

Поделиться сообщением


Ссылка на сообщение

Андрей Ефимов, мое персональное вам спасибо и почтение, счастье и здоровье в комплекте! :) 

Без вас Delphi сообщество многое бы потеряло..

Насчет склеивания dex файлов, судя по коммандной строке в батнике, dex файлы можно склеивать просто указав их пути - к примеру, в ней указано сразу 3 файла classes.dex (который может лежать тут, это может быть какой нибудь предыдущий dex файл) test_classes.dex и classes.dex от Embarcadero.

java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX%

Еще один ньюанс о котором я забыл, и промучился пол дня переименовывая  проект 10 раз т.к. выскакивали разные ошибки. А переименовывать его нужно было, потому что -  андроид запоминал битый пакет и не давал его ставить по новой.

Спойлер

If your Android application is not configured to be deployed with a valid classes.dex file, and you run your application on an Android device from RAD Studio or install on your device an APK file of your application generated with RAD Studio, the installation will fail, but it will leave data in your Android device preventing you from installing applications with the same package name as your application.

Не забудьте в Deployment при добавлении classes.dex поставить напротив него в колонке  Remote Path строчку "classes\"!

 

Иначе будет 

Unable to create process: Unable to install '<APK file>'. Failure [INSTALL_FAILED_DEXOPT]

Также есть оф. инструкция: Using a Custom Set of Java Libraries In Your RAD Studio Android Apps

 

 

Отредактировал ENRGY

Поделиться сообщением


Ссылка на сообщение

Спасибо, приятно слышать :).

7 часов назад, ENRGY сказал:

Насчет склеивания dex файлов, судя по коммандной строке в батнике, dex файлы можно склеивать просто указав их пути - к примеру, в ней указано сразу 3 файла classes.dex (который может лежать тут, это может быть какой нибудь предыдущий dex файл) test_classes.dex и classes.dex от Embarcadero.

java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX%

А конечный файл нормальный получается? по размерам и по работоспособности?

По размерам должен получиться на несколько КБ больше, чем основной classes.dex приложения.

7 часов назад, ENRGY сказал:

Не забудьте в Deployment при добавлении classes.dex поставить напротив него в колонке  Remote Path строчку "classes\"!

Ага, поэтому, я в каждой статье связанной с classes.dex пишу об этом :)

Поделиться сообщением


Ссылка на сообщение
В 31.01.2016 в 21:02, Andrey Efimov сказал:

Ссылка: http://delphifmandroid.blogspot.ru/2016/01/ansroidservicebroadcastreceiver.html

Автор: Ефимов Андрей

Описание: [AndroidService+BroadcastReceiver] Автозапуск службы после рестарта ОС

 

p.s. Тему почистил

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

UPD. Пересобрал свой проект (gps трекер). Пытаюсь запустить после рестарта именно само приложение, но ничего не помогает. Делал как в ЭТОЙ статье. Собственно даже предоставленный сэмпл у меня не работает. Пытаюсь подсунуть в библиотеки сгенерированный java файл, в юзер пермишнах галочку ставлю, .dex решил не добавлять ибо в инструкции написано что так можно.

UPD 2. Пересобрал с .dex классами - приложение тут же крашится после запуска. Почти прям как сэмпл из блога (rad studio tokyo).

Отредактировал MikeWuzHere

Поделиться сообщением


Ссылка на сообщение
В 19.02.2017 в 15:18, Andrey Efimov сказал:

Спасибо, приятно слышать :).

А конечный файл нормальный получается? по размерам и по работоспособности?

По размерам должен получиться на несколько КБ больше, чем основной classes.dex приложения.

Ага, поэтому, я в каждой статье связанной с classes.dex пишу об этом :)

Кстати можно ли использовать classes.dex из вашего семпла? правда у меня ни со сгенерированным не работает, ни с Вашим :(

Поделиться сообщением


Ссылка на сообщение

Есть у кого готовый сэмпл приложения, которое загружается при перезагрузки системы? На Tokyo приложение из блога товарища Andrey Efimov собирается отлично, но крашится уже на телефоне, причем тут же при запуске, без ошибок.

Поделиться сообщением


Ссылка на сообщение
В 28.06.2017 в 07:47, MikeWuzHere сказал:

Пытаюсь подсунуть в библиотеки сгенерированный java файл,

В Java файле всё правильно прописали?

В 28.06.2017 в 07:47, MikeWuzHere сказал:

.dex решил не добавлять ибо в инструкции написано что так можно.

Можно, но тогда нужно добавить jar-файл.

В 28.06.2017 в 12:36, MikeWuzHere сказал:

Кстати можно ли использовать classes.dex из вашего семпла?

В вашем случае - нет.

1 час назад, MikeWuzHere сказал:

На Tokyo приложение из блога

На Токио не проверялось. Статья написана для Seattle, но 100% работает на Berlin (только вчера реализовывал данную функцию в новом приложении), а вот Токио пока в топку.

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...