Как да ограничим броя на известията, изпращани от услуга в 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 във вашия пример) до дадено местоположение, за да бъде уведомен; всеки път, когато изчислявате отново разстоянията, ако откриете, че вече сте „достатъчно близо“, но колоната все още не отразява това, знаете, че потребителят току-що е въвел близостта на това местоположение и е време да поставите известие в опашка за това. Отбележете в DB, ​​че потребителят вече е близо до това местоположение, така че да можете да потиснете излишните известия за това местоположение. Не забравяйте да изчистите малкото „достатъчно близо“, след като напуснете близостта.

Все още ще има някои излишни известия, ако сте точно на ръба на „достатъчно близо“, така че ще трябва да добавите малко обезсърчаване, но това трябва да ви помогне.

person dsandler    schedule 07.01.2013
comment
Благодаря много за това предложение. Това е наистина добра идея и със сигурност ще я пробвам. И съжалявам, ако това изглежда глупав въпрос, но какво е debouncing? Много благодаря още веднъж. :) - person user1625971; 13.01.2013
comment
debouncing основно означава да се уверите, че няма да получите куп повтарящи се активации случайно. Например може да искате да потиснете случайно двойно щракване върху бутон за купуване в пазарска количка, защото не искате да таксувате потребителя два пъти или (в този случай) да гарантирате, че когато сте точно на ръба на местоположение не получавате куп преходи навътре/навън/вътре/навън всички подред. - person dsandler; 15.01.2013