2017-03-05 70 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。

祝你好運