2011-04-28 2 views
0

Я пытаюсь запустить службу из моей функции предпочтения. Я хочу запустить службу на каждом из них.Android - Как остановить предыдущее выполнение службы перед перезагрузкой?

У меня есть четыре условия в моем onPreferenceChangeListener, и каждое условие должно начинать то же обслуживание с разными значениями.

Когда я меняю предпочтение в первый раз, когда он запускает службу, и когда я меняю предпочтение во второй раз, он запускает службу с новым значением, но не останавливает выполнение предыдущего условия, поэтому теперь у меня есть служба, которая дает результаты для двух условий, и если я изменяю предпочтение в третий раз, он начинает производить результат для трех условий, но мне нужно запустить эту службу только для текущего состояния.

Вот мой PreferenceActivity's код: -

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. : -

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"); 
     } 
    } 

Вот мой BroadcastReceiver: -

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"); 
    } 
} 
} 

Я не знаю, что я делаю неправильно, так Пожалуйста, помогите !!

Thanks

ответ

1

Ваш сервис может быть перезагружен без вас. Однако у вас есть проблема, потому что в этом случае myTimer не срывается. Вам необходимо реализовать метод onDestroy в вашем классе, определить, прекращается ли ваша служба (потому что вызывается stopSelf или Context.stopService).

Если да, то вы должны удалить модификатор static из переменной myTimer, так что не торчать между запусками службы и в onDestroy метода необходимо вызвать myTimer.cancel(), чтобы остановить его, так как в противном случае он будет просто повесить, и у вас не будет никакой ссылки на него, чтобы отменить его.

В вашем методе startServices добавьте следующее перед вызовом myTimer.scheduleAtFixedRate:

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

он все еще ведет себя так же. :( – Varundroid

+0

Тогда другая возможность заключается в том, что это результат того, что объект Timer статичен. Я отредактирую свой ответ, чтобы объяснить, почему это может быть проблемой. – Brigham

+0

да, его работа сейчас. :) Вы были правы, я не был отмена объекта mytimer. Теперь я вызываю myTimer.cancel() в onDestroy(), и он работает как он. Большое спасибо. :) – Varundroid

 Смежные вопросы

  • Нет связанных вопросов^_^