質問

私は自分の優先反応性からサービスを開始しようとしています。すべてのOnPreferenceChangelistenrでサービスを開始したいと思います。

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

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

これが私のものです 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);
}
}

そして、私の優先反応性の影響を受けるはずの私のサービスコード。 : -

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

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

ありがとう

役に立ちましたか?

解決

あなたのサービスがあなたに気付かずに再起動されているかもしれません。ただし、その場合、 myTimer 取り壊されていません。実装する必要があります onDestroy クラスの方法、サービスが停止しているかどうかを判断します(どこかで stopSelf また Context.stopService 呼ばれています)。

もしそうなら、あなたは削除する必要があります static からの修飾子 myTimer 変数、サービスの開始と onDestroy 電話する必要がある方法 myTimer.cancel() それを止めるために、そうでなければそれはただぶら下がっていて、それをキャンセルするためにそれを参照することはできません。

あなたの中で startServices 方法、通話の前に以下を追加します myTimer.scheduleAtFixedRate:

mainTask.cancel();
mainTask = new MainTask();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top