如何在每天中午和每次启动时运行服务 [英] How to run a service every day at noon, and on every boot

查看:15
本文介绍了如何在每天中午和每次启动时运行服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我有一个 SQLite 数据库,其中包含一个以毫秒为单位的日期行.我希望每天显示一条通知如果自从我的数据库中存储的最后一个日期值已经过去了 30 天.服务似乎是完成此检查的好方法.

In my app I have SQLite database that has one table with date rows in milliseconds. I would like to have a notification shown every day IF 30 days has passed since the last date value stored in my database. A service seems to be a good way to accomplish this check up.

我遇到了 Commonsware 的 WakefulIntentService 并认为它可能是答案,但我真的不知道我应该如何实现它.在演示中,它在启动完成后 5 分钟后启动服务,这很好,但我需要添加什么才能让它在每个中午启动.(...但只显示一个通知/天,而不是同时显示,从启动和日常检查开始)

I ran into Commonsware's WakefulIntentService and thought it could be the answer but I really don't know how should I implement it. In the demo it starts a service after 5 minutes since boot is complete which is just fine but what do I need to add to get it also start at every noon. (... but only to show one notification / day, not both, as from boot and regular daily check up)

我知道这可以使用 AlarmManager 解决,但真的不知道如何解决.因此,我需要的帮助是给我一些示例/关键点,以便在每次启动和/或每天不运行应用程序的情况下启动服务.

I know this could be solved using AlarmManager but really don't know how. So, the help I need is to give me some samples / key points to get the service start on every boot and/or every day without app running.

谢谢

推荐答案

Android alarmmanager 就是您的答案.将其与广播接收器一起使用,该接收器也会在手机唤醒时重置闹钟.

Android alarmmanager is your answer. use it with a broadcast receiver which also resets the alarms on phone wake.

现在有代码示例:在方法内部设置闹钟:

Now with code example: Setting alarm inside a method:

Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction("packagename.ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
            0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pendingIntent);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

您的间隔接收器:

public class AlarmReceiver extends BroadcastReceiver {
private final String SOMEACTION = "packagename.ACTION"; //packagename is com.whatever.www
@Override
public void onReceive(Context context, Intent intent) {
    Time now = new Time();
    now.setToNow();
    String time = FileHandler.timeFormat(now);

    String action = intent.getAction();
    if(SOMEACTION.equals(action)) {
        // here you call a service etc.
    }

用于在手机关机时重置闹钟的接收器.

Receiver for resetting alarms whenever phone has been shut down.

public class AlarmSetter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // get preferences
        SharedPreferences preferences = context.getSharedPreferences("name_of_your_pref", 0);
        Map<String, ?> scheduleData = preferences.getAll();

        // set the schedule time
        if(scheduleData.containsKey("fromHour") && scheduleData.containsKey("toHour")) {
            int fromHour = (Integer) scheduleData.get("fromHour");
            int fromMinute = (Integer) scheduleData.get("fromMinute");

            int toHour = (Integer) scheduleData.get("toHour");
            int toMinute = (Integer) scheduleData.get("toMinute");

            //Do some action
        }
    }

}

manifest很重要,这个是在application下加的:

Manifest very important, this is added under application:

        <receiver android:name="AlarmReceiver">
        <intent-filter>
            <action android:name="packagename.ACTION"/>
            <action android:name="packagename.ACTION2"/>
        </intent-filter>
    </receiver>

    <receiver android:name="AlarmSetter" >
        <intent-filter>
            <action
                android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

此外,为了使其正常工作,您需要添加权限以在清单中使用以下行接收引导广播:

Also in order for this to work you need to add permission to receive the boot Broadcast in the manifest with following line:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

希望这能解决问题,如果有任何错误请告知.

Hope this cleared things up, if any errors plz tell.

编辑(添加警报设置示例):

Edit (added alarmsetter example):

public class AlarmSetter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Do your stuff
    }
}

这篇关于如何在每天中午和每次启动时运行服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆