android 死亡自动启动,应用程序死亡时,Android Background Service正在重新启动

本文详细解释了Android服务中START_NOT_STICKY模式的工作原理,指出它如何决定服务的重启行为。通过实例展示,当应用被杀后,服务不再自动重启,直到主动重新启动。理解这对于正确设计服务生命周期至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

它取决于onStartCommand返回的值。

您必须返回START_NOT_STICKY

根据doc:

For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand(): START_STICKY is used for services that are explicitly started and stopped as needed, while START_NOT_STICKY or START_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them

简而言之:

如果返回START_STICKY,只要资源可用,就会重新创建服务。如果您返回START_NOT_STICKY,则必须重新启用发送新意向的服务。

因为所有这一切触发了我的好奇心,我做了一个示例应用程序来测试这个。你可以找到所有的sources here的拉链

有一个startService按钮和stopService按钮,做你会期望从他们。

该服务在onStartCommand中返回START_NOT_STICKY。

我在onCreate,onStartCommand和onDestroy中放了敬酒。

这里会发生什么:

>如果我按开始,调用onCreate和onStart

>如果我按停止,onDestroy被触发

>如果我按两次启动,onCreate被调用一次和onStartCommand两次

所以它的行为正如人们所期望的。

如果我开始服务,杀死应用程序,如你所述,onDestroy不会被调用,但不是onCreate或onStart。

如果我回到应用程序,我再次按开始,onCreate被调用,这意味着,如我之前写的,START_NOT_STICKY阻止服务自动重新启动。

我想你的应用程序中有其他的东西,启动服务再次(也许一个挂起的意图)。

### .NET Core 5 BackgroundService 实现和用法 #### 创建背景服务类 为了创建一个 `BackgroundService` 类,在项目中新增一个名为 `Worker.cs` 的文件。该类需继承自 `BackgroundService` 并重写其虚方法 `ExecuteAsync(CancellationToken stoppingToken)` 来定义长间运行的任务逻辑[^1]。 ```csharp using Microsoft.Extensions.Hosting; using System.Threading; using System.Threading.Tasks; public class Worker : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { // 执行具体业务逻辑 await Task.Delay(1000, stoppingToken); } } } ``` #### 注册服务至依赖注入容器 为了让应用程序识别并启动这个后台服务,需要将其作为托管服务注册到依赖注入容器中。这通常是在 `Program.cs` 文件内完成的: ```csharp static void Main(string[] args) { var host = new HostBuilder() .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }) .Build(); host.Run(); } ``` 上述代码片段展示了如何配置主机构建器以添加托管服务实例,并最终调用 `Run()` 方法使应用保持活动状态直到收到终止信号为止[^4]。 #### 处理依赖关系和服务生命周期 当涉及到依赖项,需要注意的是托管服务应被注册为单例模式下的组件。这意味着如果要从构造函数注入其他服务,则这些服务也应该是单例类型的,避免直接注入具有较短生存期(如作用域或瞬态)的服务。对于确实需要访问非单例服务的情况,推荐做法是通过 `IServiceScopeFactory` 动态创建新的作用域来获取所需的服务实例[^5]。 #### 启动与停止行为定制化 除了基本的功能外,还可以进一步扩展 `StartAsync` 和 `StopAsync` 方法来自定义服务启动前后的准备工作以及清理操作。这两个异步方法允许开发者在实际执行任务之前做一些初始化设置或是释放资源等工作[^3]。 ```csharp protected override async Task StartAsync(CancellationToken cancellationToken) { // 初始化工作... } protected override async Task StopAsync(CancellationToken cancellationToken) { // 清理工作... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值