android服务START_STICKY START_NOT_STICKY

时间:2013-08-22 17:44:43

标签: java android android-intent android-service

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

以下是我的观察。

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

START_NOT_STICK>申请关闭后,服务无效。

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

你能帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:3)

您需要设置一个BOOT接收器,在设备启动时启动服务警报(将间歇性地唤醒并确保您的服务正在运行)。 ALARM接收器应该每分钟(或左右)唤醒,以确定您的服务尚未被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" />