如何在系统启动时启动服务并每 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。 像这样:

  1. 首先,创建一个将由 Intent 触发的接收器,

  2. 在您的 activity 中,创建触发接收器的意图,

  3. 为触发接收器的意图创建一个挂起的意图,最后 4. 使用警报管理器触发挂起的意图。
  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

希望对您有所帮助。