Перейти к содержанию
Fire Monkey от А до Я

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


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

  • Модераторы

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

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

Описание: [broadcastReceiver] Автозапуск приложения после перезагрузки ОС

Ссылка на комментарий
  • 1 месяц спустя...

Добрый день, как сделать паузу, что бы приложение стартовало на много позже. например секунд через 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);
Изменено пользователем fsdb
Ссылка на комментарий

подскажите пожалуйста отложенный запуск после старта ОС.......

 

на данный момент код такой и НЕ РАБОТАЕТ старт именно прилоежния - закрывается после старта. сервис стартует норм. 

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);
}


  }


 }
  
}

Изменено пользователем fsdb
Ссылка на комментарий
  • Модераторы

Про отложенный запуск, можно попробовать запланировать запуск при помощи AlarmManager'a. У BroadcastReceiver, в системе есть ограничение, т.е. он должен отработать за 10 сек (не более) или что-то вроде этого, тут надо почитать справку и статейки по BroadcastReceiver'у в интернете...

 

По поводу закрывающегося приложения, BroadcastReceiver написан вроде правильно, ищите ошибку в приложении, смотрите логи...

Ссылка на комментарий

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 я ознакомился в Вашей статье, но там получается что нужно знать точное время. в данном случае я не знаю точного времени рестарта ОС.

Изменено пользователем Andrey Efimov
Ссылка на комментарий
  • Модераторы

По поводу "отложить на 5 сек", честно говоря, такая задача никогда не стояла, первое, что приходит в голову, попробовать использовать Timer, TimerTask (на Java).

Про AlarmManager, речь шла не о том, чтобы устанавливать задачу из самого приложения, а о том, чтобы установить задачу прямо из BroadcastReceiver. Когда сработает BroadcastReceiver, вы можете получить в нём текущее время и уже запланировать задачу в AlarmManager. Но всё это теория, надо пробовать...

Ссылка на комментарий
спасибо. я думал что из 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);	

}


  }


 }
  
}

Изменено пользователем fsdb
Ссылка на комментарий
  • Модераторы

В коде, при создании интента, забыли указать, какое приложение хотите запустить.

Если меняете код в сообщении, то ставьте галочку "Добавить надпись «Отредактировано...»" и отписывайтесь в сообщении об этом

Ссылка на комментарий
  • 2 года спустя...

В Embarcadero RAD Studio 10.1 Berlin повторить фокус не получается. вроде бы все тоже самое делаю. генерирую classes и подключаю,  компилирую но после рестарта ОС автозапуска нет. Не совсем понятно можно ли этим компонентом сделать тоже самое? 

https://github.com/barisatalay/delphi-android-broadcast-receiver-component

 

Изменено пользователем Александр Лукьянов (Filament Extruder 1.75)
Ссылка на комментарий

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

Ссылка на комментарий

Ребята столкнулся еще с такой проблемой. пытаюсь каждые 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 секунд


	

 

Изменено пользователем Александр Лукьянов (Filament Extruder 1.75)
Ссылка на комментарий

Вот такой например вариант. Может быть тут ошибка.?

 

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.

 

Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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