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

Java 如何创建始终运行的后台服务?,java,android,service,android-activity,Java,Android,Service,Android Activity,我的问题是如何创建一个始终运行的后台服务。我创建了一个IntentService,只要应用程序还在运行,它就会在后台运行。然而,当应用程序被终止时,服务也随之消失。我想要创建的是创建一个始终运行和发布通知的后台服务。(类似于whatsapp、facebook或任何其他类似应用程序。) 单击通知时,它也应该启动应用程序 我该怎么做?您必须使用start命令启动服务。您必须在服务中重写onStartCommmand函数: @Override public int onStartComman

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

单击通知时,它也应该启动应用程序


我该怎么做?

您必须使用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\u STIKY
表示服务将自动重启()

如果您使用bindService功能而不是startCommand,您的服务将停止,然后所有绑定的活动都将停止


更重要的是,如果您想在启动设备后自动启动服务,您必须实施
BroadcastReceiver
以接收
ACTION\u BOOT\u COMPLETED
意图,并处理此事件以启动服务

最好的方法是创建自定义服务,扩展您的服务而不是意图服务。并在您的服务中启动一个单独的线程。启动应用程序时启动服务 更重要的一点是,不要将其绑定到任何对象,因为一旦您的对象被销毁,服务将被终止。 然后onStartCommand()方法返回START\u 我将为您提供示例实现

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在1亿秒后重新启动服务。在kitkat中,START\u STICKY不起作用。您必须实现onTAskRemoved。还有一件事,如果用户转到应用程序设置并停止您的服务,则您无法重新启动它

只要您的活动还在,下面的操作就可以了

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}
不幸的是,当您的应用程序被终止,并且设备资源耗尽时,它将终止应用程序。

但是,如果您想让您的服务持续运行几天,请确保您在前台运行您的服务。

您是否查看了警报接收器和未决意图?他们可以让一项服务运行,包括在你的手机处于睡眠状态时。如果你找到一种方法让你的服务运行,而不是让它成为前台服务,这是安卓系统的一个主要缺陷,可能会被修复。(编辑:或不编辑。显然我不明白START_STICKY是如何工作的)对于新的API,您可以使用以下内容:谢谢,华为设备工作正常。嗨,Preethi,你能看看这个吗?上面关于绑定的评论是不正确的。如果您只绑定,是的,如果您解除绑定,服务将被终止,但是如果您先启动服务,然后绑定,它将永远运行。不适用于MI和Oppo设备,您有其他解决方案吗?Kotlin的协同程序将作为单独的线程工作吗?