当前位置: 首页 > 面试题库 >

一段时间后反复运行方法的服务

端木桐
2023-03-14
问题内容

我想创建一个服务,该服务会在10秒钟后反复运行一种方法,直到我将其停止为止,即使该应用已关闭也是如此。我的尝试代码如下

package com.example.tauben;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class Reminder extends Service {


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        TimerTask task = new TimerTask() {
            public void run(){
                f();
            }
        };

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, 10000);
    }

    public void f(){
        Toast t = Toast.makeText(this, "Service is still running", Toast.LENGTH_SHORT);
        t.show();
   }

}

这就是我启动服务的方式。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(Log_TAG,"_____________RESTART__________");

    Intent i= new Intent(this, Reminder.class);
    startService(i); 
}

该程序立即停止运行;如何更改代码以获得所需的行为?


问题答案:

创建一个广播接收器,在接收到来自AlarmManager以下站点的广播后,它将启动您的服务:

public class SyncAlarm extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent data) {

    // set alarm to start service
    Calendar calendar = new GregorianCalendar();
    calendar.setTimeInMillis(System.currentTimeMillis());

    Calendar cal = new GregorianCalendar();
    cal.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR));
    cal.set(Calendar.HOUR_OF_DAY,  calendar.get(Calendar.HOUR_OF_DAY));

    // start service after an hour
    cal.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 60);
    cal.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
    cal.set(Calendar.MILLISECOND, calendar.get(Calendar.MILLISECOND));
    cal.set(Calendar.DATE, calendar.get(Calendar.DATE));
    cal.set(Calendar.MONTH, calendar.get(Calendar.MONTH));

    // set alarm to start service again after receiving broadcast
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, SyncAlarm.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    am.cancel(pendingIntent);
    am.set(AlarmManager.RTC, cal.getTimeInMillis(), pendingIntent);

    intent = new Intent(context, Reminder.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startService(intent);
    }
}

当您启动应用程序时,第一次启动广播接收器:

    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, SyncAlarm.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    am.cancel(pendingIntent);
    am.set(AlarmManager.RTC, System.currentTimeMillis(), pendingIntent);

还将其添加到清单文件中:

<receiver android:name=".SyncAlarm" >
</receiver>

如果您希望在资源可用时立即由Android系统启动服务,而不是接收AlarmManager的广播,则也应该对此START_STICKY有所了解。



 类似资料:
  • 问题内容: 我需要在预定义的时间长度内运行一些代码,当时间到时它需要停止。当前,我正在使用TimerTask来允许代码执行一段设定的时间,但这导致代码创建无尽的线程,并且效率很低。有更好的选择吗? 当前代码; 问题答案: 如果您使用的是Java5或更高版本,请考虑和。使用前者,您可以安排任务在指定的延迟后或以指定的时间间隔运行,因此,它可以更可靠地接管的角色。 该设施管理延迟(“每100毫秒运行一

  • 我正在尝试创建一个运行游戏循环线程的surfaceView,我花了很多时间来解决这个问题,运行了一段时间后,游戏循环似乎很好,它继续运行,并在第一次运行后继续抛出错误,它运行了一段时间,并像它假设的那样绘制,但随后返回null,我已将System.out。println();在多个位置查看某些方法是否正在运行,以及它们运行了多少次(是的,我知道使用日志,但我不太喜欢它们),无论如何,我注意到的是,

  • 我有带oauth2安全mySql数据库连接和一些控制器的Spring Boot应用程序。我已经在AWS服务器上部署了它,它工作得很好,但它在一段时间后关闭了,它没有得到很多API调用,所以没有理由DDOS失败或outOfMemmory错误,我可以在日志中看到以下消息 2018-10-28 10:58:55.979信息1253---[线程-3]ConfigServletWebServerApplic

  • 问题内容: 我有一个python celery-redis队列处理一次上传和下载值得一次演出和大量演出的数据。 很少有上传内容需要花费几个小时的时间。但是,一旦完成了这样的任务,我就目睹了这种奇怪的芹菜行为:芹菜调度程序通过将其再次发送给工作人员来重新运行刚刚完成的任务(我正在运行一个工作人员),并且它在同一时间发生了2次任务! 有人可以帮助我知道为什么会发生这种情况以及如何预防吗? 这些任务肯定

  • 本文向大家介绍PHP间隔一段时间执行代码的方法,包括了PHP间隔一段时间执行代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP间隔一段时间执行代码的方法。分享给大家供大家参考。具体分析如下: PHP如何设置每隔一段时间自动执行某段代码?例如定时生成静态文件之类的,这就需要设置休眠时间,即每隔一段时间程序就会调用某段代码. 代码如下: 希望本文所述对大家的PHP程序设计有所帮助

  • 我们有一个具有Ha all策略的2节点RabbitMQ集群。我们在应用程序中使用Spring AMQP与RabbitMQ对话。生产者部分工作正常,但消费者工作了一段时间并暂停。生产者和消费者作为不同的应用程序运行。更多关于消费者部分的信息。 我们将与一起使用,使用手动模式和默认 在我们的应用程序中,我们创建队列(按需)并将其添加到侦听器中 当我们从10个和20个开始时,消费大约持续15个小时并暂停