Как ограничить количество уведомлений, отправляемых службой в Android?

Мой проект Android дает напоминания на основе местоположения. В сервисе я вычисляю расстояние от текущего местоположения до всех местоположений в базе данных. Если расстояние меньше 500 м, пользователю выдается уведомление. Проблема в том, что, поскольку вычисление расстояния и отправка уведомлений выполняются внутри службы, уведомления продолжают поступать повторно для одного и того же места, если расстояние составляет менее 500 м. В конечном итоге приложение должно быть закрыто принудительно. Вот метод onLocationChanged класса обслуживания:

    public void onLocationChanged(Location location) {
    double lat = location.getLatitude(),lng = location.getLongitude(),dblat = 0,dblng=0;

    Location currentlocation = new Location("current Location");
    currentlocation.setLatitude(lat);
    currentlocation.setLongitude(lng);

    int NOTIFICATION_ID = 1;
    String ns = Context.NOTIFICATION_SERVICE;

     String title,date,today;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
        Calendar cal=Calendar.getInstance();
        today = String.valueOf(cal.get(Calendar.YEAR)) + "-"
                + String.valueOf(cal.get(Calendar.MONTH)) + "-"
                + String.valueOf(cal.get(Calendar.DAY_OF_MONTH));

    SQLiteDatabase database = new SQLiteHelper(getApplicationContext()).getWritableDatabase();
    Cursor c = database.rawQuery("select title,reminderdate,latitude,longitude from Reminder where type=1", null);


    int icon = R.drawable.ic_launcher;
    if(c.getCount()>0)
    { //System.out.println("c not null");
    c.moveToFirst();
    while(!c.isAfterLast())
    {
        title=c.getString(0);
        date=c.getString(1);
        if(date.equals(today))
        {
        dblat=c.getDouble(2);
        dblng=c.getDouble(3);
        Location dblocation = new Location("db Location");
        dblocation.setLatitude(dblat);
        dblocation.setLongitude(dblng);

        Double distance = (double) currentlocation.distanceTo(dblocation);
    if(distance<500)

        //Toast.makeText(this, "distance " + distance, Toast.LENGTH_LONG).show();

      {    long when = System.currentTimeMillis();
          Notification notification = new Notification(icon,title, when);

          RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification);
          contentView.setImageViewResource(R.id.notification_image, R.drawable.ic_launcher);
          contentView.setTextViewText(R.id.notification_title, "My custom notification title");
          contentView.setTextViewText(R.id.notification_text, "My custom notification text");
          notification.contentView = contentView;

          Intent notificationIntent = new Intent(this, ShowReminder.class);
          notificationIntent.putExtra("title", title);
          PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

          notification.contentIntent = contentIntent;

          notification.flags |= Notification.FLAG_NO_CLEAR; //Do not clear the notification
          notification.defaults |= Notification.DEFAULT_LIGHTS; // LED
          notification.defaults |= Notification.DEFAULT_VIBRATE; //Vibration
          notification.defaults |= Notification.DEFAULT_SOUND; // Sound

          mNotificationManager.notify(NOTIFICATION_ID, notification);       
    }   }
        c.moveToNext();
    }}

    c.close();
    database.close();

}

Как я могу сделать так, чтобы уведомление приходило только один раз для определенного места, когда я рядом с ним, вместо того, чтобы оно приходило повторно? Любая помощь будет оценена. Большое спасибо!


person user1625971    schedule 05.01.2013    source источник


Ответы (1)


Вам нужно будет добавить некоторую логику в свою службу, чтобы более тщательно решать, когда должны запускаться уведомления.

Например, вы можете добавить в свою таблицу столбец, который отслеживает, находится ли пользователь в настоящее время «достаточно близко» (‹500 в вашем примере) к заданному местоположению, чтобы получить уведомление; каждый раз, когда вы повторно вычисляете расстояния, если вы обнаруживаете, что теперь находитесь «достаточно близко», но столбец еще не отражает этого, вы знаете, что пользователь только что вошел в близость к этому местоположению, и пора поставить в очередь уведомление об этом. Сделайте заметку в БД, что пользователь теперь находится рядом с этим местом, чтобы вы могли подавить избыточные уведомления об этом месте. Не забудьте сбросить бит «достаточно близко», как только вы покинете близость.

Если вы находитесь на грани «достаточно близко», по-прежнему будут появляться некоторые избыточные уведомления, поэтому вам нужно будет добавить некоторое устранение неполадок, но это должно помочь вам.

person dsandler    schedule 07.01.2013
comment
Большое спасибо за это предложение. Это действительно хорошая идея, и я обязательно ее попробую. И мне очень жаль, если это кажется глупым вопросом, но в чем проблема? Еще раз большое спасибо. :) - person user1625971; 13.01.2013
comment
устранение неполадок в основном означает предотвращение нескольких случайных повторных активаций. Например, вы можете захотеть подавить случайный двойной щелчок по кнопке покупки в корзине покупок, потому что вы не хотите взимать с пользователя дважды, или (в этом случае) гарантируя, что когда вы находитесь прямо на краю Если вы не получите кучу переходов «вход / выход / вход / выход» подряд. - person dsandler; 15.01.2013