Моят проект за 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();
}
Как мога да направя само едно известие да идва само веднъж за определено местоположение, когато съм близо до него, вместо да идва многократно? Всяка помощ ще бъде високо оценена. Благодаря много!