在我的应用中,我让用户下载文件。由于用户知道的长动作,我决定使用服务,并将其作为前台服务启动。我希望服务启动,完成下载并自行终止,它不应该一直运行。
以下是我从主要活动开始启动服务的电话。
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的调试中运行。
有什么想法吗?有没有其他办法可以杀死这项服务?
答案 0 :(得分:1)
stopForeground()方法仅停止Service
的前景状态。以false
为参数,它甚至不会删除您可能希望它执行的通知,因此您可以将其切换为true
。
要使Service
停止,您可以拨打stopSelf()。
所以你的代码可能是这样的:
Task.Factory.StartNew(async () => {
await download(id);
stopForeground(true);
stopSelf();
});
(...除非在没有实际运行代码的情况下错过了一些细微的细节。但无论如何你都会得到基本的想法。)