如何在系统启动时启动服务并每 1 分钟重复一次
How to start a service when system boot and repet every 1 minute
我有一个 BroadcastReceiver 启动我的服务,这个服务使用异步发出 HTTP 请求然后显示通知,但我没有让服务在每次系统启动时都是 运行自动,然后每 1 分钟一次。
这是我的 AndroidManifest:
<receiver android:name=".notificar.InicializarServico" android:exported="false">
<intent-filter>
<action android:name="INICIALIZAR_SERVICO"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
<service android:enabled="true" android:name=".notificar.ServicoNotificar">
<intent-filter>
<action android:name="SERVICO_ATUALIZAR"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
BroadcastReceiver的代码在这里:
public class InicializarServico extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("NAMURA LANCHES", "O SISTEMA FOI INICIADO");
Log.v("NAMURA LANCHES", "Iniciando o serviço de atualização");
// Preparar Intent para inicializar o serviço
agendar(context, 5);
Log.v("NAMURA LANCHES", "O Serviço sera iniciado em 15 segundos");
}
private void agendar(Context context, int i) {
Intent myIntent = new Intent(context, ServicoNotificar.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, i); // first time
long frequency= i * 1000; // in ms
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, pendingIntent);
}
}
这是我的服务class:
public class ServicoNotificar extends Service{
private String RequestURL = "http://sandbox.omeuprofissional.com/requests/meus_pedidos.php";
private final int duration = 3000;
private static final String ACTION_RESCHEDULE =
"br.com.namuralanches.android.intent.action.SERVICE_RESCHEDULE";
Handler myHandler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
Thread testThread;
boolean threadRunning = false;
@Override
public void onCreate() {
super.onCreate();
myHandler = new Handler();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("NAMURA LANCHES", "Service started");
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
SharedPreferences preferencias = getSharedPreferences("mesa", MODE_PRIVATE);
String registro = preferencias.getString("REGISTRO_MESA", null);
String hashMesa = preferencias.getString("HASH_MESA", null);
if ((registro != null) || (hashMesa != null)) {
new ListarCompras().execute(RequestURL, hashMesa, registro);
}
}
}, 10000);
stopSelf(startId);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
Log.v("NAMURA LANCHES", "SERVICO DESTRUIDO");
super.onDestroy();
threadRunning = false;
}
}
我做了一些更改现在我迷路了,我什至没有看到创建服务的日志,只有日志 BroadcastReceiver
您将必须使用 AlarmManager 来启动您的服务。要使用 AlarmManager,您需要一个要触发警报的未决 Intent。
像这样:
首先,创建一个将由 Intent 触发的接收器,
在您的 activity 中,创建触发接收器的意图,
- 为触发接收器的意图创建一个挂起的意图,最后 4. 使用警报管理器触发挂起的意图。
- 请记住,当您的 Receiver 从您的警报管理器接收到内容时,它会通过 Intent 触发您的服务。可以使用alarmManager的setRepeating方法设置重复时间。
看看这个堆栈溢出 post 例如 How to start Service using Alarm Manager in Android?。
有关详细信息,请查看此 link(与 AlarmManager 一起用于定期任务)
https://guides.codepath.com/android/Starting-Background-Services
希望对您有所帮助。
我有一个 BroadcastReceiver 启动我的服务,这个服务使用异步发出 HTTP 请求然后显示通知,但我没有让服务在每次系统启动时都是 运行自动,然后每 1 分钟一次。
这是我的 AndroidManifest:
<receiver android:name=".notificar.InicializarServico" android:exported="false">
<intent-filter>
<action android:name="INICIALIZAR_SERVICO"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
<service android:enabled="true" android:name=".notificar.ServicoNotificar">
<intent-filter>
<action android:name="SERVICO_ATUALIZAR"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
BroadcastReceiver的代码在这里:
public class InicializarServico extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("NAMURA LANCHES", "O SISTEMA FOI INICIADO");
Log.v("NAMURA LANCHES", "Iniciando o serviço de atualização");
// Preparar Intent para inicializar o serviço
agendar(context, 5);
Log.v("NAMURA LANCHES", "O Serviço sera iniciado em 15 segundos");
}
private void agendar(Context context, int i) {
Intent myIntent = new Intent(context, ServicoNotificar.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, i); // first time
long frequency= i * 1000; // in ms
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, pendingIntent);
}
}
这是我的服务class:
public class ServicoNotificar extends Service{
private String RequestURL = "http://sandbox.omeuprofissional.com/requests/meus_pedidos.php";
private final int duration = 3000;
private static final String ACTION_RESCHEDULE =
"br.com.namuralanches.android.intent.action.SERVICE_RESCHEDULE";
Handler myHandler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
Thread testThread;
boolean threadRunning = false;
@Override
public void onCreate() {
super.onCreate();
myHandler = new Handler();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("NAMURA LANCHES", "Service started");
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
SharedPreferences preferencias = getSharedPreferences("mesa", MODE_PRIVATE);
String registro = preferencias.getString("REGISTRO_MESA", null);
String hashMesa = preferencias.getString("HASH_MESA", null);
if ((registro != null) || (hashMesa != null)) {
new ListarCompras().execute(RequestURL, hashMesa, registro);
}
}
}, 10000);
stopSelf(startId);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
Log.v("NAMURA LANCHES", "SERVICO DESTRUIDO");
super.onDestroy();
threadRunning = false;
}
}
我做了一些更改现在我迷路了,我什至没有看到创建服务的日志,只有日志 BroadcastReceiver
您将必须使用 AlarmManager 来启动您的服务。要使用 AlarmManager,您需要一个要触发警报的未决 Intent。 像这样:
首先,创建一个将由 Intent 触发的接收器,
在您的 activity 中,创建触发接收器的意图,
- 为触发接收器的意图创建一个挂起的意图,最后 4. 使用警报管理器触发挂起的意图。
- 请记住,当您的 Receiver 从您的警报管理器接收到内容时,它会通过 Intent 触发您的服务。可以使用alarmManager的setRepeating方法设置重复时间。
看看这个堆栈溢出 post 例如 How to start Service using Alarm Manager in Android?。
有关详细信息,请查看此 link(与 AlarmManager 一起用于定期任务) https://guides.codepath.com/android/Starting-Background-Services
希望对您有所帮助。