0

我使用Google地圖創建了一個應用程序來檢查我的位置,並在我接近標記時提醒我。如何停止應用程序關閉後啓動的服務 - android

如果我關閉了這個應用程序,我創建了一個服務,從我的主要活動開始在OnDestroy()方法中。該服務啓動並執行得非常好。但是當我再次打開應用程序時,我需要停止此服務,所以我把停止服務(意圖)放在OnCreate方法中。但該服務並沒有停止,並不斷向我發送通知。

我的服務:

public class ServiceClass extends Service{ 
private ArrayList<Prod> est = new ArrayList<Prod>(); 
private int i = 0; 
private float[] distance = new float[2]; 

private LocationListener locationListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) { 
     i = 0; 
     while (i < est.size()){ 
      Location.distanceBetween(location.getLatitude(), location.getLongitude(), est.get(i).getLocation().latitude, est.get(i).getLocation().longitude, distance); 
      if (distance[0] > est.get(i).getRange()) { 

      } else { 
       Toast.makeText(ServiceClass.this, "in circle"+i, Toast.LENGTH_SHORT).show(); 

       NotificationCompat.Builder mBuilder = 
         new NotificationCompat.Builder(ServiceClass.this) 
           .setSmallIcon(R.mipmap.ic_launcher) 
           .setContentTitle("Distance") 
           .setContentText("Test notification"); 
       NotificationManager mNotificationManager = 
         (NotificationManager) getSystemService(
           Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(1, mBuilder.build()); 

       Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
       Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
       r.play(); 
      } 
      i++; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 
}; 

public ServiceClass() { 
} 


@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    GetLocation get = new GetLocation(); 
    get.execute(); 
    Toast.makeText(ServiceClass.this, "Service started", Toast.LENGTH_SHORT).show(); 
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    locationManager.removeUpdates(locationListener); 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
    return START_STICKY; 
} 

在我MapsActivity我在開始的onDestroy服務:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Intent intent = new Intent(this, ServiceClass.class); 
    startService(intent); 
} 

這是工作。該應用程序已關閉,服務已啓動,並在我的位置靠近時顯示通知。


問題是,當我再次打開應用程序時,我需要取消服務,以便在應用程序打開時不顯示通知。

但是沒有工作。

我叫stopService在我的onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    Intent intent = new Intent(this, ServiceClass.class); 
    stopService(intent); 
} 

不要工作,服務繼續向我發送通知。

我在清單中聲明的​​服務:

<service 
    android:name=".Controller.ServiceClass" 
    android:enabled="true" 
    android:exported="false" > 
</service> 

回答

1

你可以嘗試重寫ServiceonDestroy()方法,並從LocationManager取出位置監聽器。您還應該取消通知。

下面的代碼添加到您的服務:

@Override 
public void onDestroy() { 
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    locationManager.removeUpdates(locationListener); 

    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(
          Context.NOTIFICATION_SERVICE); 
    mNotificationManager.cancel(1); 
} 
+0

讓我看看我的理解。從我的ServiceClass中覆蓋一個onDestroy方法,用位置管理器刪除位置偵聽器?我怎麼樣?就像我在我的地圖活動中聲明onDestroy一樣? – FelipeRsN

+0

剛剛更新了您的服務代碼的答案。 –

+0

謝謝你的幫助。我嘗試過並努力工作。 – FelipeRsN

相關問題