在 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()的主要内容,如果未能解决你的问题,请参考以下文章