2010-08-20 7 views
4

아직 내 위치 기반 알람 안드로이드 응용 프로그램을 만들고 있습니다. 알림 및 근접 경고를 시작하는 AlarmService 클래스가 있습니다. 나는 (서비스의 다른 인스턴스를 시작할 때, 다음 서비스 중지 :하지만,Android 서비스의 여러 인스턴스를 중지하는 방법은 무엇입니까?

Intent intentAlarmService = new Intent(this, AlarmService.class); 
stopService(intentAlarmService); 

이 일어나는 것입니다 : 내가 사용 서비스를 중지하려고

startService(intentAlarmService); 

: 나는 함께이 서비스를 시작하고 즉, 앱을 종료하고, 앱을 실행하고, 서비스를 시작하십시오.) - 서비스의 이전 인스턴스가 아직 실행 중이라는 것을 발견했습니다 (토스트를 통해). 예를 들어 AlarmService 클래스에는 onLocationChanged 메서드가있는 LocationListener가 있습니다. 그래서,이 방법에서, 내가 넣어 :

Toast.makeText(AlarmService.this, "AlarmTitle: " + mAlarmTitle, Toast.LENGTH_SHORT).show(); 

를 내가 때 서비스를 다시 시작 토스트는 이전 AlarmTitles에 게재, 현재 AlarmTitle 계속.

AlarmService를 중지하려고 할 때 무언가가 작동하지 않습니다. 무엇이 될 수 있습니까?

참고 : 응용 프로그램을 다시 설치하면 서비스가 중단됩니다. 그런 다음 서비스를 시작하면 현재 AlarmTitle 만 토스트에 표시됩니다 (매번 이런 일이 발생하기를 원합니다).

내 서비스에 문제가 있습니다. 내가 할 수있는 어떤 아이디어?

감사합니다. MY APP FROM


CODE : (토스트를 통해)

public void onDestroy() { 
    super.onDestroy(); 

    Intent alarmIntent = new Intent(getApplicationContext(), AlarmReceiver.class); 

    PendingIntent pendingIntentAlarm = PendingIntent.getBroadcast(getApplicationContext(), PENDING_INTENT_REQUEST_CODE1, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

    pendingIntentAlarm.cancel(); 

    Intent intentAlarmService = new Intent(getApplicationContext(), AlarmService.class); 

    stopService(intentAlarmService); 

    mNtf.cancel(NOTIFICATION_ID1); 
    mNtf.cancelAll(); 
} 

답변

6

내가 발견 서비스의 이전 인스턴스가 여전히 실행됩니다.

내 생각에 아마도 removeUpdates()으로 전화하여 LocationListener을 (를) 호출하지 못했을 것입니다. Android 라이프 사이클 관점에서 볼 때 서비스의 실제 실행 사본은 단 하나이지만 누출을 통해 다른 서비스가 가비지 수집되는 것을 방지합니다.

또한 getApplicationContext() 번을 모두 this으로 바꿉니다.

+0

는 여전히 안드로이드 프로그래밍에 작은 새입니다. 나는 메모리 누수가 무엇인지 알지만, "누출 서비스"는 무엇을 의미합니까? 내 앱에 문제가있는 것으로 보이는 점에 대해 좀 더 설명해 주시겠습니까? 감사합니다. getApplicationContext()가 발생하는 것을 유감스럽게 생각합니다. –

+0

@Yasir Malang : 당신이'registerLocationUpdates()'를 호출하고'removeUpdates()'를 호출하지 않았다고 믿습니다. – CommonsWare

+0

도움 주셔서 감사합니다. 내 코드를 살펴 봤는데 LocationListener 클래스를 세 가지로 구현했다. 다른 클래스에서 1 개의 공용 클래스에 액세스하는 방법을 모르기 때문에이 작업을 수행했습니다. 1 개의 public LocationListener 클래스를 만들고 그 클래스로부터 다른 클래스를 상속받는 코드를 작성하는 방법은 무엇입니까? –

0

시험이 :

private Boolean Tb = true; 
if(condition) 
{ 
    if(Tb) 
    { 
    Toast.makeText(getApplicationContext(),"content...", Toast.LENGTH_LONG).show();    
    } 
Tb =false; 

final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
    @Override 
      public void run() { 

      Tb =true; 
     } 
     }, Toast.LENGTH_LONG); 

    } 
} 
관련 문제