目前我有一个扩展服务的单例类:
public class ServiceSingleton extends Service {
private static ServiceSingleton instance;
private static boolean serviceSt;
private static PrefValues preferences;
private static Context context;
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
public static ServiceSingleton getInstance(Context cont) {
if (instance == null) {
context = cont;
// Some code
}
return instance;
}
所以基本上我通过使用类似的东西每30分钟在这个类中运行一些方法:
private static void oneTasks() {
//task itself
}
private static void oneService() {
if (!serviceSt) {
serviceRunning = false;
return;
}
serviceRunning = true;
oneTasks();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
oneService();
}
}, (INTERVAL));
}
我也听说AlarmManager
可以做同样的事情。
无论如何,我的问题是,如果我正在运行定期方法,哪种方式调用方法是最好的方法(特别是考虑到电池使用情况)?
答案 0 :(得分:2)
目前我有一个像这样扩展服务的单例类
呸。不要将服务无限期地保存在静态数据成员中。
所以基本上我每隔30分钟在这个课上运行一些方法
你还没有说明你是怎么做到的。
无论如何,我的问题是,如果我正在运行定期方法,哪种方式调用方法是最好的方法(特别是考虑到电池使用情况)?
如果您的目标是仅在您的流程因其他原因而运行时才开展此项工作,欢迎您使用您想要的任何内容。我会使用ScheduledExecutorService
。
如果您的目标是执行此项工作,即使您的应用未运行,AlarmManager
也会涵盖该方案。使用IntentService
对其进行组合,以便您的进程在实际工作时只需要在系统RAM中。
如果你的目标是做这项工作,即使你的应用没有运行,即使设备处于睡眠状态,你也需要AlarmManager
使用_WAKEUP
警报,再加上WakefulBroadcastReceiver
,我的WakefulIntentService
或等效内容。
答案 1 :(得分:1)
通过使用警报管理器,您可以注册一个重复警报,该警报将在每个特定时间自动触发,即使您的应用程序已关闭。所以它在电池使用方面非常有效。
然后在闹钟的广播接收器内你必须实现你需要的东西。如果你的方法花费的时间超过几秒钟,你应该考虑创建一个新线程或使用IntentService类。
答案 2 :(得分:0)
我知道这肯定不是最优雅和最好的解决方案,但你可以简单地让Thread
有一个无限循环,最后有SystemClock.sleep(1800000)
,所以基本上是这样的:
final Thread buf_liberator = new Thread(
new Runnable() {
public void run() {
while (true) {
/* Your stuff */
SystemClock.sleep(1800000);
}
}
}
);
buf_liberator.setPriority(7);
buf_liberator.start();
此外,您需要在Thread
内设置停止条件,因为您无法再使用stop()
方法停止此操作。
答案 3 :(得分:0)
您也可以通过CountDownTimer
来完成CountDownTimer countDownTimer;
public void usingCountDownTimer() {
countDownTimer = new CountDownTimer(Long.MAX_VALUE, 10000) {
// This is called after every 10 sec interval.
public void onTick(long millisUntilFinished) {
setUi("Using count down timer");
}
public void onFinish() {
start();
}
}.start();
}
和onPause()方法添加
@Override
protected void onPause() {
super.onPause();
try {
countDownTimer.cancel();
} catch (Exception e) {
e.printStackTrace();
}
}