2010-05-06 92 views
0

我正在嘗試編寫一個由管理後臺服務的活動組成的應用程序。但是,我想實現一個用戶設置,以便在啓動時自動啓動服務。我有用SharedPreferences實現的用戶設置,並且通過使用BroadcastReceiver並監聽BOOT_COMPLETED來啓動啓動服務。Android:如何根據用戶設置啓動服務啓動?

但是,我找不到一個好的方法來實現一個設置,以便該服務只在啓動時啓動,如果啓用了該設置。我可以想到一些便宜的方法來做到這一點(比如在服務中使用onCreate(),或者在SD卡上創建/檢查文件),但我想遵循良好的做法。

必須有一個很好的方法來做到這一點,因爲有大量的應用程序在那裏做,我只是找不到任何關於如何做到這一點。

感謝

回答

2

顯然,你需要設置此爲您的清單一BOOT_COMPLETED接收器,但此代碼的工作 - 它採取從我的應用程序之一,幾乎是直...

public class Booter extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { 
     SharedPreferences prefs = context.getSharedPreferences("PACKAGENAME_preferences",0); 
     if (prefs.getBoolean("startatboot",false)) { 
     ... DO STUFF HERE ... 
     } 
    } 
    } 
} 
+0

感謝這真的幫助我猜我給getSharedPreferences()一個錯誤的名稱,現在它的工作! – Flakkar 2010-05-07 13:20:25

+0

即使這不需要,啓動應用程序也是不好的做法。不要這樣做。下面使用@hackbod答案。 PackageManager.setComponentEnabledSetting()是一個好習慣。 – user3439968 2014-09-24 18:03:44

1

除非我失去了一些東西,你已經把所有的作品...你只需要把它們togther。由於您的BroadcastReceiver幾乎可以確定在接收BOOT_COMPLETED後啓動您的服務,只需使用onReceive中提供的Context並調用getSharedPreferences(),從BroadcastReceiver中檢查SharedPreferences即可。

如果您的啓動時啓動設置存在且已啓用,請從BroadcastReceiver啓動您的服務,如果不啓動,請不要啓動您的服務。

簡單!

+0

雖然這不起作用,因爲提供的上下文沒有我的應用程序的sharedPreferences。我只是試過這個,它不起作用... – Flakkar 2010-05-06 17:06:24

+0

真的嗎?返回的結果是: SharedPreferences prefs = context.getSharedPreferences([您的PREFS NAME HERE],0); 'prefs'爲null,或者您的設置不在其中? 僅供參考我使用我上面描述的方法,它工作正常。 – jscharf 2010-05-06 17:35:02

10

做到這一點,最好的方法是使用PackageManager.setComponentEnabledSetting():http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName,int,int)

因此,通過在清單中設置android:enabled,可以簡單地決定是否希望啓用接收。然後使用此API根據需要在運行時顯式啓用或禁用組件。如果該組件被禁用,則在啓動時它將不可用,因此不會收到廣播。

Fwiw,使用這種方法比在收到意圖時檢查首選項好得多,因爲它避免了系統必須在每次啓動時啓動您的應用程序。隨着越來越多的應用程序希望在啓動時啓動,以便可能執行某些操作,如果它們不需要啓動,它們根本不會啓動是件好事。