Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.90.142.26] |
|
Сообщ.
#1
,
|
|
|
Добрый день. я пишу программу на дельфи, однако там можно подцепить ява
мне нужно что бы мой сервис стартовал каждые 10 секунд. прошу помочь исправить вот эту часть: Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); PendingIntent intent1 = PendingIntent.getService(context, 0,restartIntent, 0); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10*1000,intent1); привожу общий код, все остальное в нем работает кроме участка что выше: 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/profile/working/autorun_app.txt"); //файл - при наличии которого выполняется автозапуск if(f.exists()){ Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 30); 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); //запуск приложения } Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); PendingIntent intent1 = PendingIntent.getService(context, 0,restartIntent, 0); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10*1000,intent1); // TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService"); // context.startService(TestLauncher); // Обычный запуск сервиса } } } |
Сообщ.
#2
,
|
|
|
Смотрите в сторону ScheduledExecutorService. Почищеный код из реального проекта вам в помощь.
import java.util.concurrent.ScheduledExecutorService; ... private ScheduledExecutorService pingerScheduler = newSingleThreadScheduledExecutor(); public void init() { pingTask = new PingTask(); pingerScheduler.scheduleAtFixedRate(pingTask, TIME_TO_DELAY_FIRST_EXECUTION, configParameters.getWebsocketPingTimeout(), TimeUnit.MILLISECONDS); } @PreDestroy public void destroy() { pingerScheduler.shutdownNow(); } private class PingTask implements Runnable { @Override public void run() { try { ... } } catch (Exception e) { ... } } } |
Сообщ.
#3
,
|
|
|
Астарот, спасибо за ответ. а чем плох AlarmManager ? Разве нельзя просто в нем сделать автостарт через 10 секунд каждые.
у меня сервис выполняет полезную работу и останалвиается. я бы хотел его запускать каждые 10 секунд например что бы он делал полезную работу |
Сообщ.
#4
,
|
|
|
Цитата Emmys @ Астарот, спасибо за ответ. а чем плох AlarmManager ? Разве нельзя просто в нем сделать автостарт через 10 секунд каждые. у меня сервис выполняет полезную работу и останалвиается. я бы хотел его запускать каждые 10 секунд например что бы он делал полезную работу Наверное ничем не плох, кроме того, что он у вас не работает Я с ним дела не имел, просто мне кажется, что если что-то нужно запускать аж каждые 10 секунд, то это нужно запустать один раз, и пусть оно каджые 10 секунд что-то делает. Отдельный поток самое то, но если в вашем случае он не подходит, то ничем не помогу. |
Сообщ.
#5
,
|
|
|
Астарот, мне удалось из приложения AlarmManager заставить вызывать каждые 10 секунд BootCompletedReceiver onReceive. но встала другая проблема... чуть ниже опишу..
я сначала в нутри сервиса пытался выполнять все что мне нужно не завершая его в потоке, но потом понял что из за критических вещей он и сам может закрыться в принципе с ошибкой или ОС закроет и работа остановится... а так вроде каждый раз свежая прогрузка.... у меня пока что большие проблемы с JAVA. никогда не работал. на данный момент на следующем этапе: Приложение после перезапуска нормально самостоятельно запускается. Вызов из приложения onReceive класса BootCompletedReceiver - происходит нормально, но на строчке (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) у меня все рушится.. если закоментировать то все ок, но мне нужно обязательно знать когда только ОС загрузилась... не подскажите в чем может быть дело? почему при вызове из основого приложения рушится именно на этой строчке. что же не так.? 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) { Intent TestLauncher = new Intent(); //создаем класс TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService"); context.startService(TestLauncher); //Обычный запуск сервиса // if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { File f = new File("/sdcard/Android/data/com.embarcadero.PanelControl/files/ehs_setting/profile/working/autorun_app.txt"); //файл - при наличии которого выполняется автозапуск if(f.exists()){ Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 30); 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); //обычный запуск приложения } // Intent restartIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); // PendingIntent intent1 = PendingIntent.getService(context, 0,restartIntent, 0); // AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10*1000,intent1); //не рабочая часть по запуску сервиса // TestLauncher.setClassName(context, "com.embarcadero.services.PanelControlService"); // context.startService(TestLauncher); // Обычный запуск сервиса // } } } |
Сообщ.
#6
,
|
|
|
Цитата Emmys @ Вызов из приложения onReceive класса BootCompletedReceiver - происходит нормально, но на строчке (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) у меня все рушится.. если закоментировать то все ок, но мне нужно обязательно знать когда только ОС загрузилась... не подскажите в чем может быть дело? почему при вызове из основого приложения рушится именно на этой строчке. что же не так.? Когда рушится что-то же говорит? Что именно? |
Сообщ.
#7
,
|
|
|
Астарот - к сожалению я этого не вижу. просто что приложение будет закрыто. отследить не получается.
а нельзя ли сделать две функции с OnReciver ?? в одном файле, что бы из программы на телефоне вызывать одну функцию а при загруузке другую..... просто я пыытался и он мне говорит раз функция публичная то нужно делать 2 разных файла. а мне нельзя 2 файла. только в одном так как у меня потом не срастется с дельфи |
Сообщ.
#8
,
|
|
|
Я смог наконец получить логи.... научили умные люди. скажите почему он так ругается на этот код
Unable to start service Intent U=0: not found ошибка по ссылке https://yadi.sk/i/KheEgK8UqYTSp AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent2=new Intent(context, BootCompletedReceiver.class); PendingIntent pi= PendingIntent.getService(context,0, intent2,0); MainActivity.pi.cancel(); am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),10000,pi); |
Сообщ.
#9
,
|
|
|
Ну... что-то он нот фаунд. Лично я дельфовые сервисы из ждавы не запускал, даже близко не представляю куда копать.
|
Сообщ.
#10
,
|
|
|
Астарот, спасибо разобрался. не хватало setClassName...
|