Andrey Efimov

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

В теме 12 сообщений

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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты

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

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


Ссылка на сообщение
Поделиться на другие сайты

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

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

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


Ссылка на сообщение
Поделиться на другие сайты

В 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.

 

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


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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