StopForeground不会停止前台服务

时间:2016-09-17 09:34:57

标签: c# android service xamarin.android

在我的应用中,我让用户下载文件。由于用户知道的长动作,我决定使用服务,并将其作为前台服务启动。我希望服务启动,完成下载并自行终止,它不应该一直运行。

以下是我从主要活动开始启动服务的电话。

Intent intent = new Intent(this, typeof(DownloaderService));
intent.PutExtra("id", ID);
StartService(intent);  

以下是我如何将服务作为前台服务启动,这是在DownloaderService类

public override void OnCreate()
{
    //Start this service as foreground
    Intent notificationIntent = new Intent(this, typeof(VideoDownloaderService));

    PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0,
                notificationIntent, 0);

    Notification notification = new Notification.Builder(this)
                       .SetSmallIcon(Resource.Drawable.Icon)
                       .SetContentTitle("Initializing")
                       .SetContentText("Starting The Download...")
                       .SetContentIntent(pendingIntent).Build();

    StartForeground(notificationID, notification);
}

以下是我处理意图的方法

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    var id = intent.GetStringExtra("id");

    Task.Factory.StartNew(async () => {
        await download(id);
        StopForeground(false);
    });

    return StartCommandResult.NotSticky;
}

下载方法必须是异步的。

我的问题是服务启动很好,download(id)方法很好,即使我关闭应用程序(这是我想要的)。但是即使在调用StopForeground(false);之后仍然继续工作。我之后不需要它运行,因为它仍然会消耗资源,并且系统不会轻易杀死它,因为它是前台服务。

我可以看到我在Android设备管理器中运行的服务,以及我的应用程序仍然在VS2015的调试中运行。

有什么想法吗?有没有其他办法可以杀死这项服务?

1 个答案:

答案 0 :(得分:1)

stopForeground()方法仅停止Service前景状态。以false为参数,它甚至不会删除您可能希望它执行的通知,因此您可以将其切换为true

要使Service停止,您可以拨打stopSelf()

所以你的代码可能是这样的:

Task.Factory.StartNew(async () => {
        await download(id);
        stopForeground(true);
        stopSelf();  
    });

(...除非在没有实际运行代码的情况下错过了一些细微的细节。但无论如何你都会得到基本的想法。)