【问题标题】:Android: how to start a service at boot based on user-settings?Android:如何根据用户设置在启动时启动服务?
【发布时间】:2011-11-17 21:40:55
【问题描述】:

我正在尝试编写一个包含管理后台服务的活动的应用程序。但是,我想实现一个用户设置,以便在启动时自动启动服务。我使用 SharedPreferences 实现了用户设置,并且通过使用 BroadcastReceiver 并侦听 BOOT_COMPLETED,我在启动时启动了服务。

但是,我想不出一种实现设置的好方法,以便仅在启用该设置时才启动服务。我可以想到一些便宜的方法来做到这一点(例如在服务中使用 onCreate(),或者在 SD 卡上创建/检查文件),但我想遵循良好的做法。

一定有一个好方法可以做到这一点,因为那里有大量的应用程序可以做到这一点,我只是在网上找不到任何关于如何做到这一点的信息。

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

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

    因此,只需通过在清单中设置 android:enabled 来决定您是否希望默认启用接收。然后使用此 API 在运行时根据需要显式启用或禁用组件。如果该组件被禁用,则在启动时它将不可用,因此无法接收广播。

    Fwiw,使用这种方法比在接收意图时检查首选项要好得多,因为它避免了系统每次启动时都必须启动您的应用程序。随着越来越多的应用程序希望在启动时启动以执行某些操作,如果不需要,让它们根本不启动是一件好事。

    【讨论】:

      【解决方案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 ...
            }
          }
        }
      }
      

      【讨论】:

      • 感谢这真的帮助了我猜我给 getSharedPreferences() 的名称错误,现在它可以工作了!
      • 即使不需要启动应用程序也是不好的做法。不要那样做。使用下面的@hackbod 答案。 PackageManager.setComponentEnabledSetting() 是很好的做法。
      【解决方案3】:

      除非我遗漏了什么,否则你已经拥有了所有的部分......你只需要把它们放在一起。

      由于您的 BroadcastReceiver 几乎肯定是在收到 BOOT_COMPLETED 后启动您的服务的原因,因此只需使用 onReceive 中提供的 Context 并调用 getSharedPreferences() 从 BroadcastReceiver 检查您的 SharedPreferences。

      如果您的启动时启动设置存在并启用,请从广播接收器启动您的服务,如果没有,请不要启动您的服务。

      简单!

      【讨论】:

      • 这不起作用,因为提供的上下文没有我的应用程序的 sharedPreferences。我刚试过这个,它不起作用......
      • 真的吗?返回的内容: SharedPreferences prefs = context.getSharedPreferences([YOUR PREFS NAME HERE],0); 'prefs' 是否为空,或者您的设置不在其中?仅供参考,我使用上面描述的方法,效果很好。
      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多