如何一起使用Resultreceiver和AlarmManager?

时间:2016-08-14 12:35:34

标签: android alarmmanager intentservice

根据this article,如果我需要在某些活动打开时从我的数据库中实现自动删除某些行(早于当前时间),我必须使用ResultReceiver:

  

ResultReceiver - 用于在服务和活动之间发送结果的通用回调接口。如果您的服务只需要在一个地方与其父应用程序连接,请使用此方法。

和AlarmManager:

  

在将来的指定时间或以经常性间隔触发

但我面临的问题是我不知道如何将AlarmManager与ResultReceiver一起使用。我的意思是我不明白如何从Activity调用我的IntentService。

在我的Intent服务中,我有类似的东西:

@Override
    protected void onHandleIntent(Intent intent) {
        Log.d(LOG_TAG, "Inside onHandleIntent");
        ResultReceiver rec = intent.getParcelableExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER);
        int rowsDeleted = notificationService.deleteAllOld(Calendar.getInstance().getTimeInMillis());

        Bundle bundle = new Bundle();
        bundle.putString(IntentConstants.UPDATE_REMINDERS_SERVICE_NOTIFICATIONS_DELETED, "Rows deleted: " + rowsDeleted);
        // Here we call send passing a resultCode and the bundle of extras
        rec.send(Activity.RESULT_OK, bundle);

    }

在活动中:

// Starts the IntentService
    public void onStartService() {
        Log.d("UpdateRemindersLog", "Inside onStartService");
        final Intent i = new Intent(this, UpdateRemindersService.class);
        i.putExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER, remindersReceiver);
        startService(i);
    }

我尝试在onStartService方法中实现AlarmManager,但它不起作用。我以为它会是这样的:

Intent intent = new Intent(getApplicationContext(), UpdateRemindersReceiver.class);
intent.putExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER, remindersReceiver);
// Create a PendingIntent to be triggered when the alarm goes off
final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, UpdateRemindersService.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

long firstMillis = System.currentTimeMillis(); // alarm is set right away
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 10*1000, pendingIntent);

那么,有人可以解释一下我如何使用IntentService实现AlarmManager吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

该方法建议,PendingIntent.getBroadcast()呼叫的目标需要是广播接收者。 AlarmManager仅适用于那些Intent

因此,您需要添加处理AlarmManager信号的广播接收器,然后启动您的服务:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Start your service here
    }
}

另外,请记住在AndroidManifest.xml文件中注册您的接收者,例如application标记内的

<receiver
    android:name=".AlarmReceiver"
    android:enabled="true" />

当您创建Intent时,您现在应该定位新的接收器类(AlarmReceiver.class)。