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

标签 android service broadcastreceiver

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

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

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

谢谢

最佳答案

Android 警报管理器就是您的答案。将它与广播接收器一起使用,该接收器还可以在电话唤醒时重置警报。

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

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

}

manifest很重要,这个是在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>

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

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

关于android - 如何在每天中午和每次启动时运行服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7845660/

相关文章:

android - .setWhen 通知不能正常工作 android

安卓联系人提取

android - Eclipse Android 项目已创建且始终缺少 R 元素

.net - 在 VB.NET 4 下创建系统服务时出现线程/定时器问题

windows - 通过批处理文件停止依赖于其他服务的 Windows 服务

android - 调用 BroadcastReceiver 时应用程序崩溃

android - 如何在android中的BroadCast接收器的Onreceive中获取全局数据

android - 动态 ListView 扩展 Activity

javascript - 使用 WMI 查找服务的依赖项,然后区分依赖的服务和依赖的驱动程序

android - C2DM 应用内注册 : unable to start service Intent