【问题标题】:android service START_STICKY START_NOT_STICKY安卓服务 START_STICKY START_NOT_STICKY
【发布时间】:2013-08-22 17:44:42
【问题描述】:

我需要让我的服务始终在后台运行。并使用“startService()”函数启动我的服务。无论应用程序的状态如何,我都不想重新启动服务。

这是我的观察。

START_STICKY > 如果应用程序启动,服务正在重新启动。当应用程序关闭时,服务也会自行重启。

START_NOT_STICK > 应用程序关闭后服务不工作。

我需要一个始终运行的服务,它会在应用程序启动时接收广播。服务状态不一定取决于应用程序是否正在运行。

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: java android android-intent android-service


    【解决方案1】:

    您需要设置一个 BOOT 接收器,它会在设备启动时启动您的 Service ALARM(它会间歇性地唤醒并确保您的 Service 正在运行)。 ALARM 接收器应该每分钟(左右)唤醒一次,以查看您的 Service 尚未被 Android 清理(这种情况会不时发生)。

    [编辑]

    您需要一个 BootReceiver 来启动您的警报,如下所示:

    public class BootReceiver extends BroadcastReceiver {
        @Override
           public void onReceive(Context context, Intent intent) {
    
              AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
              PendingIntent pendingIntent =
                       PendingIntent.getBroadcast(context, 0, new Intent(context, AlarmReceiver.class), 0);
    
              alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 2000,  60000, pendingIntent);
           }
        }
    

    alarmReceiver 看起来像这样:

    public class AlarmReceiver extends BroadcastReceiver {
        private String TAG = "AlarmReceiver";
       // onReceive must be very quick and not block, so it just fires up a Service
       @Override
       public void onReceive(Context context, Intent intent) {     
          Intent i = new Intent(context, MyLovelyService.class);      
          PendingIntent.getService(context, 0,i, 0).send();    
       }
    }
    

    最后这需要进入你的清单:

    <receiver android:name=".BootReceiver">
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
     </receiver>
    
     <receiver android:name=".AlarmReceiver" />
    

    【讨论】:

    • 谢谢德雷德尔。但我的问题是服务在应用程序关闭后会自行杀死。我怎样才能防止这种情况发生?
    • 您是如何启动服务的?如果您的服务由 ALARM(而不是从您的应用程序)启动,那么它将不会以任何方式连接到您的 Activity...我将编辑我的答案以向您展示一个示例...
    • 我正在通过 startservice 命令在应用程序中启动我的服务。我会试试你的代码。看起来合乎逻辑。谢谢!
    • 我需要使用 BOOT_COMPLETED。如果我在 1 秒后使用警报管理器启动服务,它会产生相同的效果吗?因为很难在设备上测试服务。每次都需要开机
    • 不不...您可以从任何地方(例如您的活动)触发该警报,以防它在启动时不存在
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多