Модераторы Andrey Efimov Опубликовано 27 января, 2016 Модераторы Поделиться Опубликовано 27 января, 2016 Ссылка: http://delphifmandroid.blogspot.ru/2016/01/broadcastreceiver.html Автор: Андрей Ефимов Описание: [broadcastReceiver] Автозапуск приложения после перезагрузки ОС Brovin Yaroslav, Kitty, Rusland и 1 другой 4 Цитата Ссылка на комментарий
fsdb Опубликовано 8 марта, 2016 Поделиться Опубликовано 8 марта, 2016 (изменено) Добрый день, как сделать паузу, что бы приложение стартовало на много позже. например секунд через 30 после перегрузки ОС. пытался так - не вышло . У меня ОС убивает мое приложение почти сразу на старте - 1-3 секунды работы моей программы long currenttime = System.currentTimeMillis(); long checktime = 0; // waits for 30 seconds (30000 milliseconds) while ((checktime = System.currentTimeMillis()) < (currenttime + 30000)){ //do nothing } Intent AppLauncher = new Intent(); AppLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); AppLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(AppLauncher); Изменено 9 марта, 2016 пользователем fsdb Цитата Ссылка на комментарий
fsdb Опубликовано 12 марта, 2016 Поделиться Опубликовано 12 марта, 2016 (изменено) подскажите пожалуйста отложенный запуск после старта ОС....... на данный момент код такой и НЕ РАБОТАЕТ старт именно прилоежния - закрывается после старта. сервис стартует норм. package com.PanelControlReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import java.io.File; public class BootCompletedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent TestLauncher = new Intent(); //создаем класс File f = new File("/sdcard/Android/data/com.embarcadero.PanelControl/files/ehs_setting/run_app.txt"); //файл - при наличии которого выполняется автозапуск if(!f.exists()){ TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService"); context.startService(TestLauncher); } else { TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(TestLauncher); } } } } Изменено 12 марта, 2016 пользователем fsdb Цитата Ссылка на комментарий
Модераторы Andrey Efimov Опубликовано 12 марта, 2016 Автор Модераторы Поделиться Опубликовано 12 марта, 2016 Про отложенный запуск, можно попробовать запланировать запуск при помощи AlarmManager'a. У BroadcastReceiver, в системе есть ограничение, т.е. он должен отработать за 10 сек (не более) или что-то вроде этого, тут надо почитать справку и статейки по BroadcastReceiver'у в интернете... По поводу закрывающегося приложения, BroadcastReceiver написан вроде правильно, ищите ошибку в приложении, смотрите логи... Цитата Ссылка на комментарий
fsdb Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 (изменено) Andrey Efimov понял. а как хотя бы на 5 секунд отложить старт? по моим ощущениям код просто игнорируется. Ява компилятор вроде ошибку не пишет, import java.*; ...................... long currenttime = System.currentTimeMillis(); long checktime = 0; // waits for 30 seconds (30000 milliseconds) while ((checktime = System.currentTimeMillis()) < (currenttime + 30000)){ //do nothing } Про AlarmManager я ознакомился в Вашей статье, но там получается что нужно знать точное время. в данном случае я не знаю точного времени рестарта ОС. Изменено 13 марта, 2016 пользователем Andrey Efimov Цитата Ссылка на комментарий
Модераторы Andrey Efimov Опубликовано 13 марта, 2016 Автор Модераторы Поделиться Опубликовано 13 марта, 2016 По поводу "отложить на 5 сек", честно говоря, такая задача никогда не стояла, первое, что приходит в голову, попробовать использовать Timer, TimerTask (на Java). Про AlarmManager, речь шла не о том, чтобы устанавливать задачу из самого приложения, а о том, чтобы установить задачу прямо из BroadcastReceiver. Когда сработает BroadcastReceiver, вы можете получить в нём текущее время и уже запланировать задачу в AlarmManager. Но всё это теория, надо пробовать... Цитата Ссылка на комментарий
fsdb Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 (изменено) спасибо. я думал что из BroadcastReceiver нельзя установить задачу на запуск . это хорошее решение на мой взгляд... буду пробовать!!! to Andrey Efimov: Спасибо, извиняюсь, сообщения лишние удалил Update: Короче вот рабочий код - нормальный автозапуск отложенный!!! мое приложение больше не закрывает ОС и все работает отлично!!!! Отредактировано: package com.PanelControlReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.os.Bundle; import android.os.PowerManager; import android.widget.Toast; import java.util.Calendar; import java.util.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.io.File; public class BootCompletedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent TestLauncher = new Intent(); //создаем класс File f = new File("/sdcard/Android/data/com.embarcadero.PanelControl/files/ehs_setting/run_app.txt"); //файл - при наличии которого выполняется автозапуск if(f.exists()){ Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 30); //PendingIntent pi = PendingIntent.getBroadcast(context, 0, TestLauncher, 0); //AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); //manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi); Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); PendingIntent intent1 = PendingIntent.getActivity(context, 0,restartIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC, System.currentTimeMillis() + 30000, intent1); //TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); // TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // context.startActivity(TestLauncher); } else { TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService"); context.startService(TestLauncher); } } } } Изменено 13 марта, 2016 пользователем fsdb Rusland 1 Цитата Ссылка на комментарий
Модераторы Andrey Efimov Опубликовано 13 марта, 2016 Автор Модераторы Поделиться Опубликовано 13 марта, 2016 В коде, при создании интента, забыли указать, какое приложение хотите запустить. Если меняете код в сообщении, то ставьте галочку "Добавить надпись «Отредактировано...»" и отписывайтесь в сообщении об этом Цитата Ссылка на комментарий
Александр Лукьянов (Filament Extruder 1.75) Опубликовано 17 января, 2019 Поделиться Опубликовано 17 января, 2019 (изменено) В Embarcadero RAD Studio 10.1 Berlin повторить фокус не получается. вроде бы все тоже самое делаю. генерирую classes и подключаю, компилирую но после рестарта ОС автозапуска нет. Не совсем понятно можно ли этим компонентом сделать тоже самое? https://github.com/barisatalay/delphi-android-broadcast-receiver-component Изменено 17 января, 2019 пользователем Александр Лукьянов (Filament Extruder 1.75) Цитата Ссылка на комментарий
Александр Лукьянов (Filament Extruder 1.75) Опубликовано 17 января, 2019 Поделиться Опубликовано 17 января, 2019 Ребята, важное уточнение для Xiaomi - выключайте оптимизацию в настройках телефона. в режиме разработчика. заработало не только мое приложение но еще одно из плей маркета - даже не заметил что оно и не работало пока не снял опцию и перезагрузил телефон Цитата Ссылка на комментарий
Александр Лукьянов (Filament Extruder 1.75) Опубликовано 17 января, 2019 Поделиться Опубликовано 17 января, 2019 (изменено) Ребята столкнулся еще с такой проблемой. пытаюсь каждые 5 секунд запустить свое приложение, но запуск происходит раз в минуту. какие бы настройки я не ставил. Даже если ставлю 90 секунд то все равно раз в минуту. почему так может быть. Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); PendingIntent intent1 = PendingIntent.getActivity(context, 0,restartIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.setRepeating(AlarmManager.ELAPSED_REALTIME, 5000, 3000, intent1); //manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),(long) 5000, intent1); //Повторный запуск каждые 5 секунд Изменено 17 января, 2019 пользователем Александр Лукьянов (Filament Extruder 1.75) Цитата Ссылка на комментарий
Александр Лукьянов (Filament Extruder 1.75) Опубликовано 17 января, 2019 Поделиться Опубликовано 17 января, 2019 Вот такой например вариант. Может быть тут ошибка.? package com.PanelControlReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.os.Bundle; import android.os.PowerManager; import android.widget.Toast; import java.util.Calendar; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.io.File; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.util.Log; public class BootCompletedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent TestLauncher = new Intent(); TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(TestLauncher); //обычный запуск приложени¤ } } } unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, {$IFDEF ANDROID} Androidapi.Helpers, FMX.Platform.Android, androidapi.JNI.Os, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.JNI.Telephony, Androidapi.JNI.Provider, System.DateUtils,Posix.Unistd, //ВАЖНО ЧТО ЭТОТ ФАЙЛ МЫ СГЕНЕРИРОВАЛИ ПО СТАТЬЕ ИЗ ПАПКИ C:\DB\eHomeSmartMobile\eHSforAndroid\Application\java Androidapi.JNI.BootCompletedReceiver, //ВАЖНО ЧТО ЭТОТ ФАЙЛ МЫ СГЕНЕРИРОВАЛИ ПО СТАТЬЕ ИЗ ПАПКИ C:\DB\eHomeSmartMobile\eHSforAndroid\Application\java Androidapi.JNI.Net; {$ELSE} {$IFDEF IOS} Macapi.Helpers, iOSapi.Foundation, FMX.Helpers.iOS, iOSapi.UIKit; {$ENDIF IOS} {$ENDIF ANDROID} type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} function DateTimeLocalToUnixMSecGMT(const ADateTime: TDateTime): Int64; begin Result := DateTimeToUnix(ADateTime) * MSecsPerSec - Round(TTimeZone.Local.UtcOffset.TotalMilliseconds); end; function CreateAlarmIntent(const AID: Integer): JPendingIntent; var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setClassName(TAndroidHelper.Context, TAndroidHelper.StringToJString('com.embarcadero.firemonkey.FMXNativeActivity')); Result := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 0, Intent, TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT); end; procedure set_autorestart_app; var PendingIntent: JPendingIntent; begin PendingIntent := CreateAlarmIntent(1); TAndroidHelper.AlarmManager.&setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP,DateTimeLocalToUnixMSecGMT(now),10000,PendingIntent); //запуск каждые X секунд end; procedure TForm1.Button1Click(Sender: TObject); begin Application.Terminate; end; procedure TForm1.Button2Click(Sender: TObject); begin set_autorestart_app; end; end. Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.