首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AlarmManager.setRepeating -服务似乎不会重复

AlarmManager.setRepeating -服务似乎不会重复
EN

Stack Overflow用户
提问于 2013-10-29 12:52:55
回答 1查看 1.8K关注 0票数 0

我正在开发一个Android应用程序,它每隔x秒从URL中提取XML的后台任务(用户定义的间隔,默认为60)。我的结构是这样的:

MainActivity

这将通过AlarmManager调度警报:

代码语言:javascript
运行
复制
public static void scheduleAlarm(Context voContext, int viCheckInterval)
{
    try {
        moAlarmManager = (AlarmManager) voContext.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(voContext, AlarmReceiver.class);
        moAlarmIntent = PendingIntent.getBroadcast(voContext, 0, intent,
                                                    PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar time = Calendar.getInstance();
        time.setTimeInMillis(System.currentTimeMillis());
        time.add(Calendar.SECOND, viCheckInterval);
        moAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                                       time.getTimeInMillis(), moAlarmIntent);
    } catch (Exception e) {
        Log.e("MessageCheckAlarmHandler", e.toString());
    }
}

AlarmReceiver

这是一个启动服务的BroadcastReceiver:

代码语言:javascript
运行
复制
@Override
public void onReceive(Context context, Intent intent)
{
    Context oAppContext = context.getApplicationContext();

    if (oAppContext == null) {
        oAppContext = context;
    }

    Intent serviceIntent = new Intent(oAppContext, MessagingService.class);
    oAppContext.startService(serviceIntent);
}

MessagingService

这将创建我们的内部记录器(通过TCP登录)并启动一个名为AsyncTask的FetchPageTask:

代码语言:javascript
运行
复制
public class MessagingService extends Service
{
    @Override
    public void onCreate()
    {
        super.onCreate();

        ...

        this.acquireLocks();

        try {
            String sCheckerUrl = oPreferences.getString("pref_server", "");
            int sCheckerPort = Integer.parseInt(oPreferences.getString("pref_server_port",
                                                                           "8050"));
            sCheckerUrl = String.format(URL, sCheckerUrl, sCheckerPort);

            this.moFetchInboxTask = new FetchPageTask(this.logger, this);
            this.moFetchInboxTask.execute(sCheckerUrl);
        } finally {
            this.releaseLocks();
            this.stopSelf();
        }
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();

        this.logger.close();
    }

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

    /**
     * Acquire a WakeLock and a WifiLock.
     */
    private void acquireLocks()
    {
        try {
            // Acquire a wake lock to prevent the device from entering "deep sleep"
            PowerManager oPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
            this.moWakeLock = oPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
            this.moWakeLock.acquire();
            // Acquire a WiFi lock to ensure WiFi is enabled
            WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
            this.moWifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
            this.moWifiLock.acquire();
        } catch (Exception e) {
            this.logger.error(TAG + "->onCreate()", "Error acquiring locks: " + e.toString());
        }
    }

    /**
     * Release our WakeLock and WifiLock.
     */
    private void releaseLocks()
    {
        try {
            this.moWakeLock.release();
            this.moWifiLock.release();
        } catch (Exception e) {
            this.logger.error(TAG + "->releaseLocks()", e.toString());
        }
    }
}

FetchPageTask

这扩展了AsyncTask,并完成了获取页面和解析XML的所有工作。然后,它还添加通知,并在需要时对被撤回的数据执行操作。

所有这些都可以正常工作一次,但不会随后运行。我知道AsyncTask的工作方式和我以前通过ScheduledExecutorService和ScheduledFuture使用纯Java做的一样,而且它起了作用。我决定改用AlarmManager的唯一原因是出于可维护性的考虑。

EN

回答 1

Stack Overflow用户

发布于 2013-10-29 13:18:06

我想你不需要日历了。您只想每隔x秒运行一次操作,所以应该是这样的:

代码语言:javascript
运行
复制
 moAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
                                   viCheckInterval, moAlarmIntent); 

//  viCheckInterval should be long miliseconds
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19658775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档