2010-05-06 64 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,使用这种方法比在收到意图时检查首选项好得多,因为它避免了系统必须在每次启动时启动您的应用程序。随着越来越多的应用程序希望在启动时启动,以便可能执行某些操作,如果它们不需要启动,它们根本不会启动是件好事。