2011-04-28 4 views
0

내 PreferenceActivity에서 서비스를 시작하려고합니다. 모든 onPreferenceChangeListenr에서 서비스를 시작하고 싶습니다.Android - 서비스를 다시 시작하기 전에 서비스의 이전 실행을 중지하는 방법?

나는 내 onPreferenceChangeListener에 4 가지 조건을 가지고 있으며, 각 조건은 다른 값으로 동일한 서비스를 시작해야합니다.

내가 서비스를 시작할 때 처음 환경 설정을 변경할 때 두 번째 환경 설정을 변경하면 새로운 값으로 서비스가 시작되지만 이전 조건의 실행이 중지되지 않으므로 지금 서비스가 두 가지 조건에 대한 결과를 생성하고 세 번째로 기본 설정을 변경하면 세 가지 조건에 대한 결과가 생성되기 시작하지만 필요한 것은 현재 조건에 대해서만이 서비스를 실행하는 것입니다.

public class Preferences extends PreferenceActivity 
{ 
private Button button; 
ListPreference lp; 
private Context context; 
private long duration; 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    context = this; 
    lp = (ListPreference)findPreference("autoduration"); 
    final Intent intent = new Intent(context, BackService.class); 
    lp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() 
    { 
     public boolean onPreferenceChange(Preference preference, Object newValue) 
     { 
      String newSelection = newValue.toString(); 
      int index = lp.findIndexOfValue(newSelection); 
      stopService(intent); 
      if(index==0) 
      { 
       duration = 15000; 
      } 
      else if(index==1) 
      { 
       duration = 12000; 
      } 
      else if(index==2) 
      { 
       duration = 10000; 
      } 
      else if(index==3) 
      { 
       IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
       filter.addAction(Intent.ACTION_SCREEN_OFF); 
       BroadcastReceiver receiver = new ScreenReceiver(); 
       registerReceiver(receiver, filter); 
      } 
      intent.putExtra("duration", duration); 
      startService(intent); 
      return true; 
     } 
    }); 


} 
@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    unregisterReceiver(receiver); 
} 
} 

그리고 내 PreferenceActivity를 영향을해야 그 내 서비스 코드 : -

여기 내 PreferenceActivity's 코드입니다. -

여기
private static Timer myTimer = new Timer(); 
public static final String TAG = "BackService"; 
private MainTask mainTask = new MainTask();  

public void onStart(Intent intent, int startId) 
    { 
     Long duration = intent.getLongExtra("duration", 7000); 
     startServices(duration); 
    } 

public void startServices(Long dur) 
    { 
     myTimer.scheduleAtFixedRate(mainTask,0,dur); 
    } 
private class MainTask extends TimerTask 
    { 
     @Override 
     public void run() { 
      Log.e(TAG, "I am HERE"); 
     } 
    } 

내 브로드 캐스트 리시버는 다음과 같습니다 -

public class ScreenReceiver extends BroadcastReceiver { 
public static boolean screenOn = true; 
private static final String TAG = "ScreenReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
    { 
     Log.e(TAG, "I am receiver"); 
    } 
} 
} 

나는 내가 잘못하고 그래서 제발 도와주세요하고 모르겠어요!

감사합니다.

답변

1

실현하지 못한 채로 서비스가 다시 시작될 수 있습니다. 그러나이 경우 myTimer이 해체되지 않기 때문에 문제가 발생합니다. 클래스에 onDestroy 메서드를 구현하고 서비스가 중지되는지 확인해야합니다 (stopSelf 또는 Context.stopService이 호출되기 때문). 이 서비스의 시작 사이에 당신이 그것을 중지 myTimer.cancel()를 호출하는 데 필요한 onDestroy 방법에 배회하지 않도록

는 그렇다면, 당신은 그렇지 않은 경우는 단지 의지의 myTimer 변수에서 static 수정을 제거해야합니다 주위를 어슬렁 거리면 취소 할 수있는 참조가 없습니다. 당신의 startServices 방법에서

myTimer.scheduleAtFixedRate에 호출하기 전에 다음을 추가 : 여전히 동일하게 작동하고

mainTask.cancel(); 
mainTask = new MainTask(); 
+0

. : – Varundroid

+0

또 다른 가능성은 Timer 객체가 정적 인 결과입니다. 왜 내가 문제가 될 수 있는지 설명하기 위해 내 대답을 편집 할 것입니다. – Brigham

+0

그래, 지금 작동 중입니다. :) 당신이 맞았습니다. mytimer 객체를 취소합니다. 이제 onDestroy()에서 myTimer.cancel()을 호출하고 있습니다. 많은 감사합니다. :) – Varundroid

관련 문제