0

我正在尝试从我的 PreferenceActivity 启动服务。我想在每个 onPreferenceChangeListenr 上启动一个服务。

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

这是我的广播接收器:-

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

我不知道我在做什么错所以请帮助!

谢谢

4

1 回答 1

1

您的服务可能会在您没有意识到的情况下重新启动。但是,您有一个问题,因为在这种情况下,它myTimer并没有被拆除。您需要onDestroy在您的类中实现该方法,确定您的服务是否停止(因为某处stopSelfContext.stopService正在被调用)。

如果是这样,您应该static从变量中删除修饰符myTimer,以便它不会在服务启动之间以及onDestroy您需要调用myTimer.cancel()以停止它的方法中徘徊,因为否则它只会徘徊而您不会拥有对它的任何引用以取消它。

在您的startServices方法中,在调用之前添加以下内容myTimer.scheduleAtFixedRate

mainTask.cancel();
mainTask = new MainTask();
于 2011-04-28T15:32:57.180 回答