2011-04-28 9 views
0

私のPreferenceActivityからサービスを開始しようとしています。私はすべてのonPreferenceChangeListenrでサービスを開始したいと思います。Android - サービスを再起動する前にサービスの前回の実行を停止するにはどうすればよいですか?

私のonPreferenceChangeListenerには4つの条件があり、各条件は同じ値の異なるサービスを開始する必要があります。

初めてサービスを開始したときにサービスを開始し、2度目に設定を変更すると新しい値でサービスが開始されますが、以前の条件の実行が停止されることはありません。 2つの条件の結果を生成しています.3回目の設定を変更すると、3つの条件の結果が生成され始めますが、現在の条件に対してのみこのサービスを実行する必要があります。

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

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

私は私が間違っているのかわからないので助けてください!

おかげ

答えて

1

ご利用のサービスで実現することなく再起動取得することができます。しかし、その場合はmyTimerが解体されないため、問題が発生します。クラスにonDestroyメソッドを実装し、サービスが停止するかどうかを判断する必要があります(stopSelfまたはContext.stopServiceが呼び出されているため)。

もしそうなら、それはサービスの開始との間で、そうでなければ、それだけでするので、あなたは、それを停止するmyTimer.cancel()を呼び出す必要がonDestroy方法でたむろしないように、あなたは、myTimer変数からstatic修飾子を削除する必要がありますあなたがそれをキャンセルするための参照がありません。あなたのstartServices方法で

は、myTimer.scheduleAtFixedRateに呼び出しの前に次の行を追加します。それはまだ同じように動作している

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

。 : – Varundroid

+0

もう1つの可能性は、Timerオブジェクトが静的であることの結果であるということです。なぜそれが問題になるのかを説明するために私の答えを編集します。 – Brigham

+0

ええ、今働いています。 mytimerオブジェクトをキャンセルします。今私はonDestroy()でmyTimer.cancel()を呼び出しています。どうもありがとう。 :) – Varundroid

関連する問題