私の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");
}
}
}
私は私が間違っているのかわからないので助けてください!
おかげ
。 : – Varundroid
もう1つの可能性は、Timerオブジェクトが静的であることの結果であるということです。なぜそれが問題になるのかを説明するために私の答えを編集します。 – Brigham
ええ、今働いています。 mytimerオブジェクトをキャンセルします。今私はonDestroy()でmyTimer.cancel()を呼び出しています。どうもありがとう。 :) – Varundroid