2017-03-05 41 views
0

我试图在首选项更改时使用新设置重新启动服务。我正在使用的代码大致是从this question类似于:在android偏好片段中使用startService()

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?

+0

为什么不能将GeneralPreferenceFragment设置为非静态? – 7383

+0

它引发错误“此片段内部类应该是静态的”。 – Keith

+0

你的外班是什么,内班有什么需要?请发布完整的代码以获得更好的理解。 – 7383

回答

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> 

我将推出“暂时性的活动”,然后将开始我的服务像往常一样,唯一的问题是发送的是要添加为额外的在你的意图/共享信息。

希望它帮助smh。

祝你好运