如何使用警报管理器和后台服务调用以及后台服务中的Web服务调用来创建警报?

时间:2016-09-10 11:17:26

标签: android web-services broadcastreceiver alarmmanager

我无法在标题中解释我的问题。这是我问题的详细解释:

我有一个应用程序,显示列车的到达时间。

如果火车离车站10-5分钟,我想添加用户可以创建提醒的功能。

显示一个表单以创建警报(所有值都存储在DB中)。

 alertID = db.insert_alerts(name,starttime,endtime,booleanrepeat);

我正在使用闹钟管理器来创建通知:

if (is_repeat.equals("true")) {
     new AlertsReceiver().setRepeatAlarm(getApplicationContext(), mCalendar, (int)alertID ,10000);
 } else if (is_repeat.equals("false")) {
    new AlertsReceiver().setAlarm(getApplicationContext(), mCalendar,(int)alertID);
 }

下面是Receiver类:

public class AlertsReceiver extends WakefulBroadcastReceiver {

    private int alertId;
    AlarmManager mAlarmManager;
    PendingIntent mPendingIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if(extras == null) {
            Log.d("Service","null");
        } else {

            alertId= extras.getInt("alertId");
        }


       Intent intent1 = new Intent(context,MService.class);
        intent1.putExtra("alertId", alertId);
        context.startService(intent1);


    }

    public void setAlarm(Context context, Calendar calendar, int ID) {
        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(context,AlertsReceiver.class);
        intent.putExtra("alertId", ID);
        mPendingIntent = PendingIntent.getBroadcast(context, ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);


        // Calculate notification time
        Calendar c = Calendar.getInstance();
        long currentTime = c.getTimeInMillis();
        long diffTime = calendar.getTimeInMillis() - currentTime;

        // Start alarm using notification time
        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime() + diffTime,
                mPendingIntent);


    }

    public void setRepeatAlarm(Context context, Calendar calendar, int ID, long RepeatTime) {
        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Log.e("asetRepeat",ID+"");
        Intent intent = new Intent(context, AlertsReceiver.class);
        intent.putExtra("alertId", ID);
        mPendingIntent = PendingIntent.getBroadcast(context, ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // Calculate notification timein
        Calendar c = Calendar.getInstance();
        long currentTime = c.getTimeInMillis();
        long diffTime = calendar.getTimeInMillis() - currentTime;

        // Start alarm using initial notification time and repeat interval time
        mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime() + diffTime,
                RepeatTime , mPendingIntent);


    }

    public void cancelAlarm(Context context, int ID) {
        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);


        Toast.makeText(context,"Cancelled"+ID,Toast.LENGTH_LONG).show();
        // Cancel Alarm using Reminder ID
        mPendingIntent = PendingIntent.getBroadcast(context, ID, new Intent(context, RiderAlertsReceiver.class), 0);
        mAlarmManager.cancel(mPendingIntent);

    }
}

在接收器中,我正在开始一项服务,我正在进行网络服务呼叫:

一旦设置了警报管理器。在后台服务中进行网络服务呼叫,以检查列车将到达的分钟数:

如果分钟<显示10分钟通知,否则Web服务调用应该再次运行

所以,我将webservice放在每1分钟运行一次的计时器中。

问题是如何在收到通知后停止计时器。

此外,每次接收者启动相同的服务时,一次只有一个警报正在工作。

用户可以创建多个警报,所有警报都存储在DB中。

任何人都可以告诉我实现此功能的最佳方式。

欣赏帮助......!

0 个答案:

没有答案