干净地绑定/取消绑定到应用程序中的服务

2023-12-24

我有一个绑定到持久服务的 Android 应用程序(一旦启动startService()).

该服务是应用程序的一个组成部分,因此几乎在每个 Activity 中都会使用该服务。因此,我只想绑定到服务一次(而不是在每个活动中绑定/取消绑定)并在应用程序的生命周期内保持绑定。

我已经从应用 http://developer.android.com/reference/android/app/Application.html并绑定到服务应用程序#onCreate() http://developer.android.com/reference/android/app/Application.html#onCreate%28%29。但是我现在遇到的问题是我不知道我的应用程序何时存在应用程序#onTerminate() http://developer.android.com/reference/android/app/Application.html#onTerminate%28%29从未被调用过,请参阅 JavaDoc:

此方法适用于模拟过程环境。它永远不会 在生产 Android 设备上调用,其中进程被删除 简单地杀死他们;没有用户代码(包括此回调) 这样做时被执行。

那么如何彻底解除应用程序中绑定的服务的绑定呢?


我通过计算对服务绑定的引用解决了这个问题Application. Every Activity必须打电话acquireBinding()在他们的onCreate()方法和调用releaseBinding() in onDestroy()。如果参考计数器达到零,则释放绑定。

这是一个例子:

class MyApp extends Application {
    private final AtomicInteger refCount = new AtomicInteger();
    private Binding binding;

    @Override
    public void onCreate() {
        // create service binding here
    }

    public Binding acquireBinding() {
        refCount.incrementAndGet();
        return binding;
    }

    public void releaseBinding() {
        if (refCount.get() == 0 || refCount.decrementAndGet() == 0) {
            // release binding
        }
    }
}

// Base Activity for all other Activities
abstract class MyBaseActivity extend Activity {
    protected MyApp app;
    protected Binding binding;

    @Override
    public void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        this.app = (MyApp) getApplication();
        this.binding = this.app.acquireBinding();
    }

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

干净地绑定/取消绑定到应用程序中的服务 的相关文章

  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • 在屏幕上随机生成一个圆圈并将其设为绿色或红色

    所以我一直在尝试制作一个游戏应用程序 它可以在 Android 屏幕上随机显示带有文本的红色按钮或带有文本的绿色按钮 如果有人可以帮助我 我将不胜感激 另外 如果有人知道如何做到这一点 我想慢慢地产生更快的酷优势 谢谢 SuppressLi
  • 相当于Android中的javax.swing.Timer

    有没有类似的东西javax swing Timer在安卓上 我知道如何创建自己的线程 但是有类似摆动计时器的东西吗 您可能正在寻找课程android os CountDownTimer http developer android com
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 使用 WMI 查找服务的依赖关系,然后区分依赖的服务和依赖的驱动程序

    MSDN 上有一个代码示例 它使用 WMI 枚举特定服务的所有依赖项 http msdn microsoft com en us library aa393673 v vs 85 aspx http msdn microsoft com e
  • android studio 底部工具栏的“运行”选项卡消失了

    Android Studio 底部工具栏中曾经有一个 运行 选项卡 但该选项卡不再显示 怎么把它带回来 请检查下图以了解它消失之前的位置 Run 选项卡曾经位于 TODO 选项卡之前的红色圆圈中 查看 gt 工具窗口 gt 运行 Or us
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • Android框架结构与MFC/Win32结构的比较?

    我为 Android 和 Windows 进行开发 使用 MFC 有时使用 win32 昨天我随意比较了这两个框架 它们显然非常非常不同 因此 Windows 开发与 Android 开发有很大不同 我想知道人们认为 Android 这样的
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi

随机推荐

  • 文字轮播交叉淡入淡出效果?

    我们正在尝试实现一个简单的文本轮播 用几个其他单词替换句子中的单个单词 它们将淡入 淡出 容器宽度应缩小 放大以容纳新单词 听起来很简单 但我们遇到了困难 应该像第二行一样工作www branch com http www branch c
  • Google App Engine (Java) 上的全文搜索

    关于这个主题有一些线索 但我认为我的用例有些不同 我想做的事 我的 GAE J 应用程序的全文搜索组件 索引大小较小 25 50MB左右 我不需要实时更新索引 定期重新索引就可以了 这是为了自动完成等 所以它需要非常快 我的印象是在数据存储
  • 在 Servlet 中使用 org.json 会导致 java.lang.ClassNotFoundException: org.json.JSONException

    我正在尝试开发一个 servlet 来发送一些 JSON 对象 但遇到几个异常 我相信我需要添加一些 jar 文件 但我不确定是哪个 这是 doGet 方法以及我导入的所有内容 import java io IOException impo
  • 更改导航栏按钮项目的标题

    let button UIButton button setImage UIImage named coin icon forState UIControlState Normal button addTarget self action
  • 在 docker 容器外部公开日志文件

    我有 net core 应用程序 其中 Serilog 作为日志框架 现在 Serilog 正在记录到文件 我想将此文件公开在容器外部 并像其他文件一样进行简单的访问 我根据 docker compose 参考尝试使用volume和volu
  • 如何将我的电子表格链接到应用制作工具?

    我是 App Maker 的新用户 刚刚开始使用 Google App Scripts 进行编码 所以基本上我对这个主题了解不多 今天我正在开发一个已经存在于 Google Sheets 中的应用程序 我必须使用应用程序制作工具重新创建它
  • 了解操作系统如何存储/检索 IO 设备输入

    我对键盘等 I O 设备如何存储输入以供操作系统或应用程序使用感到有点困惑 如果我有一台单处理器 单核CPU 的计算机 并且当前正在执行的进程是一个游戏 那么游戏如何能够 感知 键盘输入 即使按下按键会强制硬件中断 从而实现上下文切换 然后
  • 在海岸线附近的 ggplot 中选择栅格

    所以我有一张绘制加泰罗尼亚气压的地图 这是一个特写 我现在想选择气压高于 97 kPa 深蓝色 的所有观测值 并用它们创建一个新的数据框以供进一步分析 这是棘手的一点 我想选择符合高度过滤器 AAAAND 的观测值 并且位于地中海沿岸 大多
  • “AspNetUser”类型上的“Claims”属性不是导航属性

    我正在使用 ASP NET Identity 2 2 我正在将 ASP NET 旧成员资格迁移到新的身份系统 我正在按照中提到的步骤进行操作本文 http www asp net identity overview migrations m
  • 如何使用 Google Relyparty 禁用用户 Firebase?

    我想从我的应用程序中禁用 Firebase 用户 但 Firebase 文档只提供了删除用户的选项 我认为解决方案就像创建用户一样 https www googleapis com identitytoolkit v3 relyingpar
  • 用于 bash 补全的“have”关键字

    Is havebash 中的关键字 或者 bash 补全脚本使用非 bash 的语言吗 have gcc gcc 是很常见 看 grep have etc bash completion d 我找不到有关我见过的 bash 完成教程的任何信
  • 如何在 R 中为数据框着色

    我有以下类型的数据框 gt df V1 V2 V3 V4 V5 1 10 603 3 100 2 1 5 1 2 10 603 3 101 3 2 4 5 3 10 603 3 102 1 3 3 2 4 10 603 1 103 4 4
  • .NET 中是否存在与 UI 无关的 Point 结构?

    我认识几个Point NET 中的结构 System Drawing Point System Windows Point Sys UI Point 但它们都位于高级 UI 库 GDI WPF AJAX 中 我需要一个Point我不想将其与
  • CUDA/OpenCL 中的现实死锁示例

    对于我正在编写的教程 我正在寻找一个 现实 且简单的示例 说明由于不了解 SIMT SIMD 而导致的死锁 我想出了这个片段 这似乎是一个很好的例子 任何意见将不胜感激 int x threadID 2 if threadID gt x v
  • Python 中是否有已经制作好的字母表? [复制]

    这个问题在这里已经有答案了 我需要创建随机单词 名称random choice alphabet 对于我在 repl 中的许多游戏来说 但输入它并制作大写版本 仅辅音 元音等是很痛苦的 有没有一种内置的或可导入的方法来获取 python 中
  • 让 Bootstrap datetimepicker 在 ajax 加载后工作

    我有这个简单的脚本 可以正常形式工作 但是 如果我通过 ajax 将表单加载到 Bootstrap 3 模式中 时间和日期选择器不起作用 我知道问题是因为我通过 ajax 加载表单 那么如何为新加载的a
  • 简单的 Java 扫描器代码不起作用[重复]

    这个问题已经存在了 这是我为制作一个简单游戏而编写的一些基本代码的框架 Scanner in new Scanner System in String name String playing int age do System out pr
  • 如何从 iPhone 中的资源文件夹中获取文件夹和文件列表?

    我正在资源文件夹中执行文件夹结构 例如 Resource gt MyData gt S1 然后在S1 gt Name png data ppt 现在我想获取所有文件夹列表和文件名 这里 MyData 名称只是静态的 其他名称可能会更改 就像
  • 如何使用baseadapter将获取的json数据显示到listview中

    我是 android 和 java 的新手 最近我在使用 baseadapter 将获取的 json 数据显示到 listview 时遇到问题 起初我用过这段代码 Override protected void onCreate Bundl
  • 干净地绑定/取消绑定到应用程序中的服务

    我有一个绑定到持久服务的 Android 应用程序 一旦启动startService 该服务是应用程序的一个组成部分 因此几乎在每个 Activity 中都会使用该服务 因此 我只想绑定到服务一次 而不是在每个活动中绑定 取消绑定 并在应用