【问题标题】:Using startService() in android preferences fragment在 android 首选项片段中使用 startService()
【发布时间】:2017-07-25 01:38:20
【问题描述】:

当首选项更改时,我正在尝试使用新设置重新启动服务。我使用的代码与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?

【问题讨论】:

  • 为什么不能将 GeneralPreferenceFragment 设为非静态?
  • 它抛出错误This fragment inner class should be static
  • 你的外部类是什么,内部类需要什么?请发布您的完整代码以便更好地理解。
  • 外部类是活动本身:public class SettingsActivity extends AppCompatPreferenceActivity。 AFAIK,片段必须属于一个活动。在this question 中有一些关于为什么片段内部类必须是静态的讨论。
  • 那么最好将首选项更改侦听器移动到 GeneralPreferenceFragment 本身并调用服务。从活动中获取上下文并使用它来调用 startservice 方法

标签: java android android-fragments


【解决方案1】:

这有点晚了,但由于我正在研究该主题但仍然没有找到任何答案,所以我分享我的研究:

我正在研究一种解决方法。直接在 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>

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

希望对您有所帮助。

祝你好运

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多