在android偏好片段中使用startService()

时间:2017-03-05 03:59:40

标签: java android android-fragments

我尝试在首选项更改时使用新设置重新启动服务。我使用的代码与this question中的代码大致相似:

SettingsActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Initiate listener
    findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);

    ...

}

private Preference.OnPreferenceChangeListener sRestartMyServiceOnChangeListener = new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object obj) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(SettingsActivity.this);

        // Stop service
        stopService(new Intent(SettingsActivity.this, MyService.class));

        // Restart service
        if (sharedPref.getBoolean("service_switch", false)) {
            startService(new Intent(SettingsActivity.this, MyService.class));
        }

        return true;
    }
};

这不能在我的手机上工作,抛出错误:

findPreference(java.lang.CharSequence) is deprecated

This answer表示Android已转向基于片段的活动。 SettingsActivity 基于片段...所以我尝试在片段onCreate()中启动监听器:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // Initiate listener
        findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);

        ...

    }
}

现在我没有看到弃用错误,但我得到了一个新的错误:

Non-static field 'sRestartMyServiceOnChangeListener' cannot be referenced from a static context.  

我无法sRestartMyServiceOnChangeListener静态,因为stopService()startService()都是非静态的。我也不能使片段静止:

This fragment inner class should be static

那么当设置更改时,如何从首选项片段重新启动MyService?

1 个答案:

答案 0 :(得分:0)

现在有点晚了,但是我正在研究这个问题而仍然没有找到任何答案,所以我正在分享我的研究成果:

我正在研究解决方法。直接在XML中使用这种类型的代码:

<Preference
        android:summary="@string/summary_startBaseProfiling"
        android:title="@string/title_startBaseProfiling"
        android:key="settings_startBaseProfiling">
        <intent
    android:targetPackage="my.utar.phonesecurat"
    android:targetClass="my.utar.phonesecurat.BaseProfilingActivity" />

    </Preference>

我将启动一个“Transitory活动”,然后像往常一样启动我的服务,唯一的问题是发送/共享想要在您的意图中添加额外信息。

希望它有所帮助。

祝你好运