Java 服务在应用程序关闭时停止

Java 服务在应用程序关闭时停止,java,android,service,Java,Android,Service,我正在开发一个墙纸应用程序,在该应用程序中,我将在墙纸上设置一个具有洗牌效果的图像库,时间分别为5分钟、10分钟等。我正在使用该服务完成此任务。当应用程序仍在后台时,我的服务运行良好,但当应用程序停止时,服务将停止。这是我的服务类代码: public class WallpaperService extends Service { ArrayList<String> arrayList;int counter = 0; boolean serviceStopped; privat

我正在开发一个墙纸应用程序,在该应用程序中,我将在墙纸上设置一个具有洗牌效果的图像库,时间分别为5分钟、10分钟等。我正在使用该服务完成此任务。当应用程序仍在后台时,我的服务运行良好,但当应用程序停止时,服务将停止。这是我的服务类代码:

public class WallpaperService extends Service {
ArrayList<String> arrayList;int counter = 0;

boolean serviceStopped;

private IBinder binder = new WallpaperServiceBinder();

public WallpaperService() {
}

private Handler mHandler;

private Runnable updateRunnable = new Runnable() {
    @Override
    public void run() {
        if (serviceStopped == false)
        {
            createNotificationIcon();
        }
        queueRunnable();
    }
};

public class WallpaperServiceBinder extends Binder {
    public WallpaperService getService() {
        return WallpaperService.this;
    }
}

private void queueRunnable() {
    // 600000 : cada 10 minutos, comprueba si hay nuevas notificaciones y actualiza la
    // notification BAR
    mHandler.postDelayed(updateRunnable, 5000);
}

@Override
public int onStartCommand(Intent intent,int flag, int start_id){
    super.onStartCommand(intent,flag,start_id);
    arrayList = intent.getStringArrayListExtra("image_url");
    return START_STICKY;
}

@Override
public void onRebind(Intent intent) {
    Log.v("Service","in onRebind");
    super.onRebind(intent);
}

@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public void onCreate() {
    serviceStopped = false;
    mHandler = new Handler();
    queueRunnable();
}

@Override
public void onStart(Intent intent, int startid) {

}

public void createNotificationIcon()
{
    counter += 1;
    Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
    Picasso.with(getApplicationContext()).load(arrayList.get(counter)).into(new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            try {
                final WallpaperManager wallpaperManager =
                        WallpaperManager.getInstance(getApplicationContext());
                wallpaperManager.setBitmap(bitmap);
                wallpaperManager.suggestDesiredDimensions(1080, 1920);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            //Here you should place a loading gif in the ImageView to
            //while image is being obtained.
        }
    });
}}

如果组件调用bindService()来创建服务,而未调用onStartCommand(),则仅当组件绑定到服务时,服务才会运行。服务从其所有客户端解除绑定后,系统将销毁它

已启动的服务是另一个组件通过调用startService()启动的服务,这将导致调用该服务的onStartCommand()方法

当服务启动时,它的生命周期独立于启动它的组件。该服务可以无限期地在后台运行,即使启动它的组件已被销毁。因此,服务应该在其作业完成时通过调用stopSelf()停止自身,或者其他组件可以通过调用stopService()停止它

应用程序组件(如活动)可以通过调用startService()并传递指定服务并包含服务要使用的任何数据的意图来启动服务。服务通过onStartCommand()方法接收此意图

请注意,onStartCommand()方法必须返回一个整数。整数是一个值,用于描述在系统终止服务时系统应如何继续服务。IntentService的默认实现会为您处理此问题,但您可以对其进行修改。onStartCommand()的返回值必须是以下常量之一:

  • 如果系统在onStartCommand()返回后终止服务,请不要重新创建服务,除非有挂起的交付意图。这是最安全的选择,可以避免在不必要时运行服务,并且应用程序可以简单地重新启动任何未完成的作业

  • 如果系统在onStartCommand()返回后终止服务,请重新创建服务并调用onStartCommand(),但不要重新传递最后的意图。相反,除非有启动服务的挂起意图,否则系统将以null意图调用onStartCommand()。在这种情况下,这些意图就实现了。这适用于不执行命令但无限期运行并等待作业的媒体播放器(或类似服务)

  • 如果系统在onStartCommand()返回后终止服务,请重新创建该服务并调用onStartCommand(),并使用传递给该服务的最后一个意图。任何未完成的意图都会依次交付。这适用于主动执行应立即恢复的作业(如下载文件)的服务

  • 注意:在您的情况下,您应该使用已启动的服务,并在onStartCommand()中返回START\u STICKY或START\u REDELIVER\u INTENT(根据您的要求)

    有关服务的详细说明


    希望这有帮助。

    您是否已在清单文件中添加了这些行

    <application> <service  android:name=".ExampleService" /></application>
    
    
    

    这可能会对您有所帮助:我尝试了所有这些,但没有任何效果。请帮帮我。我的服务不是持久性的。它是您在任何特定设备制造商上测试的场景,还是所有设备的常见行为。
    <application> <service  android:name=".ExampleService" /></application>