在没有服务的情况下杀死应用程序后如何在后台线程中运行代码?

Posted

技术标签:

【中文标题】在没有服务的情况下杀死应用程序后如何在后台线程中运行代码?【英文标题】:How to run code in background thread after app is killed without Service? 【发布时间】:2021-12-11 09:10:30 【问题描述】:

我首先使用改造在后台线程上进行查询。然后我在onResponse 回调中创建一个新线程。然后我让线程休眠 10 秒并尝试执行一些代码。当线程处于休眠状态时,我退出了我的应用程序。但是,当我在线程睡眠期间退出我的应用程序时,永远不会执行记录器。

mainService = RetrofitClient.getInstance().getRetrofit().create(MainService.class);
        mainService.getPosts().enqueue(new Callback<List<Post>>() 
            @Override
            public void onResponse(@NotNull Call<List<Post>> call, @NotNull Response<List<Post>> response) 
                //Running on main thread

                new Thread(new Runnable() 
                    @Override
                    public void run() 
                        try 
                            Thread.sleep(10000);
                         catch (InterruptedException e) 
                            e.printStackTrace();
                        

                        //This code is never executed. I don't see it in the logcat.
                        Log.d(TAG, "onCreate: Background thread is still running -- " + Thread.currentThread().getName());

                    
                ).start();
            

            @Override
            public void onFailure(@NotNull Call<List<Post>> call, @NotNull Throwable t) 
                Log.e(TAG, "onFailure: Call failed", t);
            
        );

为什么Log.d(TAG, "onCreate: Background thread is still running -- ".... 运行在单独的线程上却没有执行?

这是一个关于我正在尝试做的简化示例。在我的另一个项目中,在进行改造调用后,即使用户关闭应用程序,我也想将数据保存到 SQLite。但在这个例子中,我试图找出记录器没有被执行的原因。

【问题讨论】:

“我退出了我的应用程序”——确切地说是什么意思?你做了系统返回导航吗?你做了系统HOME导航吗?您是否将应用程序从概览屏幕(最近的任务列表)中滑出?你还做了别的吗? 我将应用从最近任务列表中滑出i.imgur.com/KUtRYYb.png 【参考方案1】:

当线程处于休眠状态时,我退出了我的应用程序。

在许多(大多数?)设备上,这将终止您的进程,尤其是在您没有运行服务的情况下。终止您的进程会终止您的所有线程。

在没有Service的情况下杀死应用程序后如何在后台线程中运行代码?

如果不需要立即完成工作,您可以使用 WorkManager 将工作排入队列。

【讨论】:

如果我有一个重要的请求要执行,例如通过向端点发出 JSON RPC 请求来部署智能合约(大约需要 15 秒),并且我不希望该过程失败(因为这会花费用户的 gas 费用),那么在 Service 中提出请求会是最佳选择吗? @DIRTYDAVE:如果它必须立即发生,那么是的,服务是正确的解决方案。如果您非常确定该工作将花费不到一分钟,您可以使用普通的后台服务。如果可能需要一分钟以上,则需要在 android 8.0+ 上使用前台服务。

以上是关于在没有服务的情况下杀死应用程序后如何在后台线程中运行代码?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于状态后台或被杀死时,如何在不点击通知的情况下存储 iOS 远程通知?

如何在没有从服务或线程预览的情况下进行相机捕捉?

如何模拟Android系统杀死的服务

如何防止主线程ios杀死后台线程

什么是 Daemon 线程?它有什么意义?

如何在没有 root 访问权限的情况下在服务器上杀死其他人的 Python 进程?