如何创建一个始终运行的后台服务?

时间:2014-06-06 08:58:17

标签: java android service android-activity

我的问题是如何创建一个始终运行的后台服务。我创建了一个IntentService,只要应用程序正在运行,它就会在后台运行。但是,当app被杀死时,服务也会消失。我想要创建的是创建一个始终运行和发布通知的后台服务。 (类似于whatsapp,facebook或任何其他类似的应用程序。)

点击通知后,它也应该启动应用程序。

我该怎么做?

3 个答案:

答案 0 :(得分:11)

最好这样做是创建自定义服务,扩展您的服务而非意图服务。并在您的服务中启动一个单独的线程。在启动应用程序时启动服务 更重要的是,不要将它绑定到任何对象,导致服务将在您的对象被销毁后被杀死。 然后onStartCommand()方法返回START_STICKY 我将为您提供示例实现。

public class CustomService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    // TODO Auto-generated method stub
     Intent restartService = new Intent(getApplicationContext(),
                this.getClass());
        restartService.setPackage(getPackageName());
        PendingIntent restartServicePI = PendingIntent.getService(
                getApplicationContext(), 1, restartService,
                PendingIntent.FLAG_ONE_SHOT);

        //Restart the service once it has been killed android


        AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI);

}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

    //start a separate thread and start listening to your network object
}

}

onTaskRemoved一旦被杀死,就会在100毫秒后重启您的服务。 START_STICKY在kitkat中无效。你必须实现onTAskRemoved。还有一件事,如果用户进入应用程序设置并停止服务,则无法重新启动它

答案 1 :(得分:3)

您必须使用start命令启动服务。并且您必须在服务中重写onStartCommmand函数:

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

START_STIKY表示服务将自动重启(http://developer.android.com/reference/android/app/Service.html#START_STICKY

如果您使用bindService函数而不是startCommand,您的服务将停止,然后所有绑定的活动都会关闭。

如果您想在启动设备后自动启动服务,则必须实现BroadcastReceiver以接收ACTION_BOOT_COMPLETED意图并处理此事件以启动服务。

答案 2 :(得分:0)

只要您的活动在附近,以下情况就会发生。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

不幸的是,当您的应用程序被杀死且设备资源耗尽时,它会将其终止 但是,如果您希望将服务保持运行数天,请确保您在前台运行服务。