1

我有一项服务正在前台下载文件

@Override
    public int onStartCommand(Intent intent, int flags, int sid){
        this.sid = sid;
        PendingIntent mainIntent = PendingIntent.getActivity(this, 0, MyApplication.mainIntent, 0);
        Notification notification = new NotificationCompat.Builder(VuclipPrime.getInstance())
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Downloading Video")
                .setContentText("Initiating...")
                .setContentIntent(mainIntent)
                .setAutoCancel(false)
                .setOngoing(true)
                .build();
        startForeground(mNotificationId, notification);
        if (VideoDownloadManager.currentVideoDownloadTask != null) {
            VideoDownloadManager.currentVideoDownloadTask.start();
        } else {
            stopSelf();
        }
        return START_NOT_STICKY;
    }

当我滑动以终止应用程序时,该服务也被停止。我在 StackOverflow 上尝试了所有现有的解决方案,但没有一个有效。我尝试了 YouTube 应用,但它并没有终止它的服务。我如何做到这一点?谢谢。

4

3 回答 3

0

您正在使用 NOT_STICKY 参数启动服务。您应该在 onStartCommand() 中返回START_STICKY

@Override
    public int onStartCommand(Intent intent, int flags, int sid){
        this.sid = sid;
        PendingIntent mainIntent = PendingIntent.getActivity(this, 0, VuclipPrime.mainIntent, 0);
        Notification notification = new NotificationCompat.Builder(VuclipPrime.getInstance())
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Downloading Video")
                .setContentText("Initiating...")
                .setContentIntent(mainIntent)
                .setAutoCancel(false)
                .setOngoing(true)
                .build();
        startForeground(mNotificationId, notification);
        if (VideoDownloadManager.currentVideoDownloadTask != null) {
            VideoDownloadManager.currentVideoDownloadTask.start();
        } else {
            stopSelf();
        }
        return START_STICKY;
    }

从文档:

https://developer.android.com/reference/android/app/Service.html#START_STICKY

  • START_STICKY:当服务被杀死时,系统将尝试再次启动服务。
  • START_NO_STICKY:系统不会关心服务是否被杀死。
于 2016-07-27T10:48:47.583 回答
0

解决方案是在服务的 onTaskRemoved() 方法中启动一个虚拟活动,以防止服务被杀死。同样在启动后立即完成 DummyActivity。

检查以下代码:-

package com.your.application.services;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;


public class DownloadService extends Service {
    int mNotificationId = 001;
    Notification notification;
    private int sid;

    public DownloadService() {
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int sid) {
        this.sid = sid;
        PendingIntent mainIntent = PendingIntent.getActivity(this, 0, YourApplication.getInstance().downloadService.mainIntent, 0);
        notification = new NotificationCompat.Builder(YourApplication.getInstance())
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Starting Service")
                .setContentText("Initiating...")
                .setContentIntent(mainIntent)
                .setAutoCancel(true)
                .setOngoing(true)
                .build();
        startForeground(mNotificationId, notification);
        if (YourApplication.getInstance().downloadService.videoDownloader != null) {
            YourApplication.getInstance().downloadService.startDonwloadThread(YourApplication.getInstance().downloadService.videoDownloader);
        } else {
            stopSelf();
        }
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

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

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
            Intent intent = new Intent(this, DummyActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    }
}

虚拟活动:-

public class DummyActivity extends Activity {
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        finish();
    }
}

DummyActivity 的 AndroidManifest 条目:-

            <activity
            android:name=".downloader.DummyActivity"
            android:allowTaskReparenting="true"
            android:alwaysRetainTaskState="false"
            android:clearTaskOnLaunch="true"
            android:enabled="true"
            android:excludeFromRecents="true"
            android:finishOnTaskLaunch="true"
            android:noHistory="true"
            android:stateNotNeeded="true"
            android:theme="@android:style/Theme.NoDisplay" />
于 2016-08-31T10:49:19.027 回答
0

如果在进程处于睡眠模式时未将其列为受保护的应用程序,Android 将停止进程。转到设置->受保护的应用程序->选择您的应用程序并启用为受保护的应用程序。

于 2017-02-19T17:59:58.217 回答