在 android 首选项片段中使用 startService()

Posted

技术标签:

【中文标题】在 android 首选项片段中使用 startService()【英文标题】:Using startService() in android preferences fragment 【发布时间】: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 方法 【参考方案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>

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

希望对您有所帮助。

祝你好运

【讨论】:

以上是关于在 android 首选项片段中使用 startService()的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏片段中首选项之间的分隔符

片段中的Android SharedPreferences

Android XML 首选项问题。不能让它持久

在首选项设置中膨胀布局

Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]

在android中动态创建选项卡并使用传入的参数加载片段