当Android应用程序关闭/设置为后台时如何执行后台任务?

2023-12-21

我的 Android 4+ 应用程序连接到自定义 Web 服务,用于每隔几分钟同步一次数据。为了确保在线数据始终是最新的,我想在应用程序关闭/发送到后台时触发同步。

在 iOS 下这很简单:

  • applicationDidEnterBackground:在应用程序委托中
  • Use beginBackgroundTaskWithName:启动长时间运行的后台任务并避免在任务仍在运行时被挂起

如何在 Android 上执行此操作?

第一个问题是,没有什么相当于applicationDidEnterBackground:。到目前为止我发现的所有解决方案都建议使用主要活动onPause()方法。然而,这在任何时候都被称为主要Activity已暂停,当另一个Activity在应用程序内启动。对于onActivityPaused()方法来自ActivityLifecycleCallbacks界面。

那么,如何检测app(不仅仅是一个Activity)是关闭还是发送到后台?

第二个问题是,我没有找到任何有关如何运行后台任务的信息。所有解决方案都指向简单地启动一个AsyncTask,但这真的是正确的解决方案吗?

AsyncTask将启动一个新任务,但是当应用程序关闭/不活动时,该任务也会运行吗?我必须做什么才能防止应用程序和任务在几秒钟后挂起?在应用程序完全挂起之前,我如何确保任务可以完成?


以下代码将帮助您在应用程序关闭或在后台时发布内容:

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.widget.Toast;

public class SendDataService extends Service {
    private final LocalBinder mBinder = new LocalBinder();
    protected Handler handler;
    protected Toast mToast;
 
    public class LocalBinder extends Binder {
        public SendDataService getService() {
            return SendDataService .this;
        }
    }

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

    @Override
    public void onCreate() {
        super.onCreate();

    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() { 

// write your code to post content on server
            }
        });
        return android.app.Service.START_STICKY;
    }

}

我的代码的更多解释是:

即使您的应用程序位于后台,服务也会在后台运行,但请记住,它始终在主线程上运行,因此我创建了一个单独的线程来执行后台操作。

服务作为粘性服务启动,即使由于任何原因您的服务在后台被破坏,它也会自动重新启动。

更多详情可在这找到:https://developer.android.com/guide/components/services.html https://developer.android.com/guide/components/services.html

要检查您的应用程序是否位于前台/后台,以下代码将有所帮助:

  private boolean isAppOnForeground(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
    if (appProcesses == null) {
      return false;
    }
    final String packageName = context.getPackageName();
    for (RunningAppProcessInfo appProcess : appProcesses) {
      if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
        return true;
      }
    }
    return false;
  }
}

// Use like this:
boolean foregroud = new ForegroundCheckTask().execute(context).get();

快乐编码!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当Android应用程序关闭/设置为后台时如何执行后台任务? 的相关文章

  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • 在 Android Studio 中,为什么我必须在模拟器中单击“运行应用程序”两次才能启动应用程序?

    在 Android Studio 中 当我按播放按钮在 Android 模拟器上安装并运行应用程序时 大约 5 10 秒后 我在屏幕底部收到一条消息 显示 安装成功 但应用程序实际上并未运行在模拟器上 我必须再次按下播放按钮 这是非常令人沮
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐

  • Perl 函数名称冲突

    我遇到的情况是 我正在使用的模块有一个函数 其名称与我自己的模块中的函数完全相同 当我尝试调用模块中的函数时 OO Perl 所以 self gt function 它改为从其他模块调用该函数 我已经通过重命名我的函数来解决这个问题 但有趣
  • 如何处理Excel工作表中的数据更改事件以刷新所有数据透视表?

    我有一个应用于工作表及其更改的 VBA 代码 因此 每当工作表中有新条目或删除 任何更改 时 它都会刷新附加到它的所有数据透视表 Private Sub Worksheet Change ByVal Target As Range This
  • 检查python脚本中是否挂载了NFS共享

    我编写了一个 python 脚本 该脚本依赖于某个可用的 NFS 共享 如果未安装 NFS 共享 它会很乐意将文件复制到应安装的本地路径 但稍后当它尝试将在 NFS 服务器上创建的某些文件复制回来时会失败 我想专门捕获这个错误 这样我就可以
  • 使用 PNG 图像作为 GrabCut 的蒙版

    我有一个带有绿色和红色线条以及透明背景的 png 图像 我需要使用它作为执行 GrabCut 的遮罩 但我得到了意想不到的结果 这是我的代码 find the mask Mat mask mask create image size CV
  • 关闭弹出窗口并导航到 jQuery Mobile 中的另一个页面

    当用户按下弹出窗口内的按钮时 我试图关闭弹出窗口 对话框 并导航到另一个页面 单页面应用程序 多个 页面 jQM 1 4 0 如果我点击弹出窗口中的 是 按钮 它将导航到我想要的 page3 然后跳回起始页 如果我注释掉 popup clo
  • Go 中的一流函数

    我来自 JavaScript 它具有一流的函数支持 例如 您可以 将一个函数作为参数传递给另一个函数 从函数返回一个函数 有人能给我一个例子来说明如何在 Go 中做到这一点吗 Go语言和函数式编程 http livingcode org 2
  • MSMQ 或 Service Broker 或用于 FIFO 消息处理的批量插入?

    我们有一个场景 需要针对传入的实时事件对数据库使用更新 插入查询 我们可以选择下面提供的任何一个选项 1 MSMQ 2 SQL 服务代理 3 自定义构建的缓存机制 使用文件缓存 批量插入 触发器将插入转换为更新 如果行已存在 等 我们没有使
  • 如何在 GitHub 操作构建期间引用我的存储库中的目录?

    我有一些测试数据用于 pytest 的单元测试 我用环境变量设置了它们的位置 查看我的 pytest 日志 构建会看到环境变量 但它们引用的位置不存在 在 GitHub Actions 文档中 存储库应位于 home runner Repo
  • 在 Glassfish 服务器上的 Web 服务中使用数据库时出现“找不到合适的驱动程序”错误

    我有一个 Java Web 应用程序 并使用来自消费者 Java 应用程序的操作来处理 MySQL 数据库 当我尝试连接到数据库时 我得到 No suitable driver found for jdbc mysql localhost
  • 检索 Delphi 窗口句柄

    我正在尝试从外部应用程序获取 Delphi 应用程序的窗口句柄 我可以看到创建了一些窗口 TApplication TFrmMain 和其他一些窗口 并且我知道 TApplication 是 控制器 但从不可见 但是 我可以读取真实窗口的值
  • Rails form_for 提交按钮不起作用

    感谢您的耐心等待 对于 Rails 来说还是很陌生 使用 Rails 3 2 为一个简单的应用程序制作注册页面 我的问题是 无论表单中的信息是否有效 表单上的提交按钮都不会产生任何效果 用户模型和数据库似乎都工作正常 如果我从 Rails
  • 保存带有透明度/Alpha 通道的 TIFF

    这是我的问题 我需要创建一个 TIFF 和一个 PNG 其中调色板包含特定颜色和 Alpha 我实际上能够处理 PNG 但不能处理 TIFF 我在互联网上搜索并发现 TIFF 应该处理透明度 但并非所有软件都可以 我尝试了很多方法来加载 T
  • 非标准评估和 PackedArray

    我之前有过asked https stackoverflow com questions 4181470 custom function with non standard evaluation behaves like table怎么做a
  • 更新现有表/模型列/字段?

    如何更新表中的列和列数据类型PeeWee http docs peewee orm com en latest index html 我已经创建了表Person在我的模型的数据库中 但我现在已向模型添加了一些新字段 并更改了某些现有字段 列
  • 在 Golang 中将表单值分配给结构体

    我正在 Golang 中开发 API Rest 我正在使用 Gorm 所以我有代表数据库表的结构 在Create我收到一个带有值的表格 但现在我怀疑如何立即将所有值分配给结构 因为我有一个包含 500 个字段的表 并且我无法逐一进行分配 我
  • 如何在 woocommerce 中获得免费送货的最低订单金额

    我如何获取获得免费送货所需的最低订单金额 woocommerce free shipping min amount在 woocommerce 的管理面板 woocommerce gt 设置 gt 送货 gt 免费送货 gt 最低订单金额 中
  • Ehcache 2 maven依赖

    在我的 pom 中 我有 ehcache 2 依赖项
  • 将 SASS/SCSS 与 Django 集成

    我想将 SASS SCSS 与 Django 应用程序一起使用 我点击了链接https bitbucket org synic django sass https bitbucket org synic django sass 我使用 su
  • 从 C 中的 char* 数组中删除空格

    我正在开发一个插件C对于游戏模拟器 我想在检查输入消息是否包含任何网站网址之前删除聊天消息中的所有空格 所以 我有这样的函数来消除空白 从输入消息中删除空格 char deblank char input int i j char outp
  • 当Android应用程序关闭/设置为后台时如何执行后台任务?

    我的 Android 4 应用程序连接到自定义 Web 服务 用于每隔几分钟同步一次数据 为了确保在线数据始终是最新的 我想在应用程序关闭 发送到后台时触发同步 在 iOS 下这很简单 听applicationDidEnterBackgro