每5分钟运行一次Android方法

3

我有一个计时器,每5分钟就会执行一些操作。问题是我应该在哪里添加这个方法呢?如果我将它添加到“on create”方法中,我的计时器方法仅在启动我的应用程序时执行。而且我希望每5分钟执行一次。谢谢!

 private void timer() {
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleWithFixedDelay(new Runnable() {
      @Override
      public void run() {
        // fetching file
        tcpClient.execute();
      }
    }, 0, 60, TimeUnit.SECONDS);
  }

编辑:根据Peter Birdsall和Aleksander Lidtke的建议,看起来我需要一个AlarmManager。 编辑2:现在我已经设置好AlarmManager,但是我仍然无法每5分钟运行该方法。我是Android的新手,在哪里调用这些东西?如果我将其添加到on create方法中,它仅执行1次,但我希望它永久执行,每5分钟一次。
这个链接对我非常有帮助:https://github.com/rakeshcusat/Code4Reference/blob/master/AndroidProjects/AlarmManagerExample/AndroidManifest.xml

1
如果我将它添加到“on create”方法中,我的计时器方法只会在启动应用程序时执行。你的意图是什么?是当应用程序运行时每5分钟执行一次还是无论如何每5分钟执行一次? - Aleksander Lidtke
1
每5分钟一次,不管怎样。但是,如果我的应用程序在启动时每5分钟运行一次,那就可以了。 - Petrica
如果您想无论应用程序是否正在运行都要执行此操作,您需要一个服务和一个广播接收器来处理 android.intent.action.BOOT_COMPLETED ,这样每当手机启动时都会启动您的服务。如果您想在应用程序中执行此操作,请尝试使用 onResume 和 onStart 方法。 - Aleksander Lidtke
另外,尝试使用(AlarmManager) context.getSystemService(Context.ALARM_SERVICE)来设置一个任务,通过其.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), REPEAT_TIME_SENSORS, pendingIntent)方法递归重复执行(其中pendingIntent将启动您想要执行的代码批处理)。 - Aleksander Lidtke
每5分钟在后台进行一次网络请求会耗尽用户的电池,建议使用像GCM这样的推送服务。 - FunkTheMonk
显示剩余6条评论
4个回答

7
把这个放在oncreate里,它不仅会执行一次,我非常确定。
            Timer myTimer = new Timer();
            myTimer.schedule(new TimerTask() {
               @Override
               public void run() {
                   tcpClient.execute();
               }
            }, 0, 300000);

屏幕旋转怎么办? - Grzegorz Żur
@Petrica 稍等一下,我会给你另一种实现计时器的方法,它会起作用 :) - superuser
@Petrica 请尝试我即将发布的方法,您应该将其放置在oncreate中。 - superuser
@Petrica 我认为可能是这样的:你的tcpClient方法需要很长时间才能完成,而计时器尝试在上一次的tcpClient方法仍在运行时再次执行自己。尝试使用我在计时器中设置的时间进行更改。 - superuser
@superuser 那个时间是以毫秒为单位的吗?:) - Petrica
显示剩余9条评论

1
我正在开发一款类似的应用。我使用广播接收器和服务,并使用alarmmanager进行调度,这样你就不需要太多的开销,比如运行一个必须保持活动状态的计时器。
这是我的主要活动。我用按钮启动序列。
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

}



Button.OnClickListener btnOnClickListener = new Button.OnClickListener() {

    @Override
    public void onClick(View v) {

        if (v == btn_splash) {
                initiateAlarm(true);
                Toast.makeText(MainActivity.this, " alarm scheduled", Toast.LENGTH_LONG).show();
            }
            } else if (v == btn_cancel)
                {

                initiateAlarm(false);

                Toast.makeText(MainActivity.this, " alarm stopped", Toast.LENGTH_LONG).show();
                }
    }

};



} 

public void initiateAlarm(Boolean bactive) {
      alarmUp = false;
        alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0, 
               new Intent(this, YourService.class), 
               PendingIntent.FLAG_NO_CREATE) != null);
                if (alarmUp)
                    {
                    Log.d("myTag", "Alarm is already active");
                    Toast.makeText(this, " before scheduling Alarm is already active", Toast.LENGTH_LONG).show();
                    } else {

                        YourReceiver.scheduleAlarms(this, prefDuration, bactive);
                        Toast.makeText(this, "alarms were just scheduled", Toast.LENGTH_LONG).show();
                    }


         alarmUp = false;
         alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0, 
                new Intent(this, YourService.class), 
                PendingIntent.FLAG_NO_CREATE) != null);
                if (alarmUp)
                    {
                    Log.d("myTag", "Alarm is already active");
                    Toast.makeText(this, " after scheduling Alarm is already active", Toast.LENGTH_LONG).show();
                    }
}

}

这是您的接收器YourReceiver,它在alarmmanager中安排服务。
public class YourReciever extends BroadcastReceiver {

private static final String TAG = "YourReciever";



@Override
public void onReceive(Context ctxt, Intent i) {
  context = ctxt;

  scheduleAlarms(ctxt, (long) 3600001, true);  // 1 hour - not used

 }

 static void scheduleAlarms(Context ctxt, Long duration, Boolean bactive) {

  Log.e(TAG, " ... scheduleAlarms ");
  SharedPreferences preferences; 

  preferences = PreferenceManager.getDefaultSharedPreferences(ctxt); 
  prefDuration = preferences.getLong(PREF_DURATION, 3600000);  // 1 hour
  Log.e(TAG, " ... onReceive ... duration: " + duration);  

AlarmManager mgr=
    (AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(ctxt, YourService.class);
PendingIntent pi=PendingIntent.getService(ctxt, 0, i, 0);


mgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
                 SystemClock.elapsedRealtime() + duration, duration, pi);
if (bactive == false) {
    mgr.cancel(pi);
}


 }

}

最后这是服务类。

public class YourService extends IntentService {




public YourService() {
    super("YourService");
    Log.e(TAG, " ... YourService");

}


@Override
protected void onHandleIntent(Intent intent) {


//
//  The action you want to perform.
//


}

}

类似这样的内容需要在清单文件中声明。
 <service
        android:name="com.yourpackagename.YourService"
        android:exported="true"/>

希望这有所帮助。
祝您有一个美好的一天。

0

哦,为了明确起见,你需要在活动开始时声明tick为int变量,以便它不会超出范围。 - NathanTempelman

-1

使用这段代码,它将帮助您调用一个函数,根据您的要求进行修改。

private final long refreshDelay = 5 * 1000;
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.main);

            sendHttpRequestThread = new SendHttpRequestThread("","");
            sendHttpRequestThread.start();

        }

     class SendHttpRequestThread extends Thread {

            boolean sendHttpRequest;
            String userId;
            String pass;

            public SendHttpRequestThread(String str1, String str2) {
                this.userId = str1;
                this.pass = str2;
                sendHttpRequest = true;
            }

            public void stopSendingHttpRequest() {
                sendHttpRequest = false;
            }

            protected void onStop() {
                sendHttpRequestThread.stopSendingHttpRequest();
                super.stop();
            }

            @Override
            public void run() {
                while (sendHttpRequest) {
                    //Call U r function from here 

                    SystemClock.sleep(refreshDelay);
                }
            }
        }

我已经使用了调用方法来每5秒发送一次HTTP请求,请看这就是你想要的,希望这可以帮助你。 - Developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接