如何在每天中午和每次启动时运行服务

时间:2011-10-21 06:17:17

标签: android service broadcastreceiver

在我的应用程序中,我有一个SQLite数据库,它有一个表,日期行以毫秒为单位。我希望每天都显示一条通知 IF 自我的数据库中存储的最后一个日期值起经过30天。服务似乎是完成此检查的好方法。

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

我知道这可以使用AlarmManager解决但实际上不知道如何解决。所以,我需要的帮助是给我一些样本/关键点,以便在每次启动时和/或每天没有应用程序运行时启动服务。

感谢

3 个答案:

答案 0 :(得分:41)

Android alarmmanager是你的答案。将它与广播接收器一起使用,该接收器也会重置电话唤醒时的警报。

现在使用代码示例: 在方法中设置警报:

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.
    }

接收器,用于在手机关机时重置闹钟。

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
        }
    }

}

清单非常重要,这是在应用程序中添加的:

        <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>

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

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

希望这可以解决问题,如果有任何错误,请告知。

修改(添加闹钟示例):

public class AlarmSetter extends BroadcastReceiver {

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

答案 1 :(得分:5)

这个答案看起来很古老。 现在,我完全建议人们查看Google提供的Sync Adapter框架。 它是为这些东西定制的。 这是链接:https://developer.android.com/training/sync-adapters/index.html

答案 2 :(得分:2)

  

在演示中,它在启动完成后5分钟后启动服务,这很好但是我需要添加什么才能让它在每个中午开始。

更改setRepeating()来电的初始时间。该示例显示从现在起一分钟 - 您需要进行计算以确定下一个中午的时间。

您可以在this OnBootReceiver中看到来自不同示例项目的那种计算示例。在这里,我将警报设置为每天在用户指定的时间启动。