我可以在android中编写一个系统属性监听器吗?

2024-03-18

使用 setprop 命令(通过 adb)在 android 中设置系统属性后,有没有办法在我自己的服务中监听此更改?

我尝试使用 SystemProperties.addChangeCallback 但没有收到通知。我是否错过了什么?


您可以在服务中创建一个方法,该方法应该获取任何系统属性,并且该方法应该调用 Looper.loop();这样该循环将不时轮询 SystemProperty 这个实现可能不是优化的方式,但它在 Android 4.4.2 中使用,你可以在这里看到http://androidxref.com/4.4.2_r2/xref/frameworks/base/services/java/com/android/server/SystemServer.java http://androidxref.com/4.4.2_r2/xref/frameworks/base/services/java/com/android/server/SystemServer.java你可以在上面的链接看到:

    boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
    boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false);
    boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
    boolean disableTelephony = SystemProperties.getBoolean("config.disable_telephony", false);
    boolean disableLocation = SystemProperties.getBoolean("config.disable_location", false);
    boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
    boolean disableNonCoreServices = SystemProperties.getBoolean("config.disable_noncore", false);
    boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);

这些布尔变量在 Looper.loop() 的帮助下在 initAndLoop() 方法中进行检查;在这里,您可以通知其他组件,即使是单个 SystemProperty 的任何更改。

另一种方法是创建静态回调并调用任何 SystemProperty 中的任何更改,请在此处查看 SystemService 的主分支代码:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/SystemService.java https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/SystemService.java

您可以在上面的链接中看到以下代码正在做什么:

private static Object sPropertyLock = new Object();

static {
    SystemProperties.addChangeCallback(new Runnable() {
        @Override
        public void run() {
            synchronized (sPropertyLock) {
                sPropertyLock.notifyAll();
            }
        }
    });
}

/**
 * Wait until given service has entered specific state.
 */
public static void waitForState(String service, State state, long timeoutMillis)
        throws TimeoutException {
    final long endMillis = SystemClock.elapsedRealtime() + timeoutMillis;
    while (true) {
        synchronized (sPropertyLock) {
            final State currentState = getState(service);
            if (state.equals(currentState)) {
                return;
            }

            if (SystemClock.elapsedRealtime() >= endMillis) {
                throw new TimeoutException("Service " + service + " currently " + currentState
                        + "; waited " + timeoutMillis + "ms for " + state);
            }

            try {
                sPropertyLock.wait(timeoutMillis);
            } catch (InterruptedException e) {
            }
        }
    }
}

/**
 * Wait until any of given services enters {@link State#STOPPED}.
 */
public static void waitForAnyStopped(String... services)  {
    while (true) {
        synchronized (sPropertyLock) {
            for (String service : services) {
                if (State.STOPPED.equals(getState(service))) {
                    return;
                }
            }

            try {
                sPropertyLock.wait();
            } catch (InterruptedException e) {
            }
        }
    }
}

此信息来自 Shridutt Kothari。查看this https://groups.google.com/forum/embed/#!topic/android-platform/ifDMD-aXwp8谷歌帖子关于监听单个 SystemProperty 更改

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

我可以在android中编写一个系统属性监听器吗? 的相关文章

  • 在 Android 模拟器上运行完整的 Android 手机 ROM

    正如标题所说 是否可以在 Android 模拟器中运行完整的 Android 设备 ROM 是的 你可以 但让它 100 工作可能很困难 大多数 ROM 都包含其运行硬件的特定驱动程序 我并不是 100 全力以赴 但可以尝试以下步骤 创建
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • Android Toast 消息不起作用

    我正在通过 Andengine 为 Android 开发游戏 我有 MainActivity 类和 GameScene 类 我在 GameActivity 中使用 Toast 消息 它正在发挥作用 Toast makeText this H
  • 由于现有相机用户,相机“0”的手电筒不可用

    我想创建一个应用程序 它有一个用于录制视频的按钮和另一个单独的切换按钮 用于在录制视频期间打开闪光灯 我已经使用camera2 API为最近的androids构建了相机应用程序 可以通过图像按钮访问 我将火炬模式设置为切换按钮 但这根本不起
  • Android 中是否可以使用滑动视图导航的刻度线?

    我想在 Android 应用程序中创建一组页面 这些页面可以水平滑动并使用刻度线来指示当前页面在我拥有的 12 个页面集中的位置 Android 设计文档中提到了像这样使用刻度线的设计模式 http developer android co
  • Android:将声音保存为铃声/SQLiteConstraintException

    我正在尝试使用 Android 将声音保存为铃声this http www stealthcopter com blog 2010 01 android saving a sound file to sd from resource and
  • adb 今天无法连接到 VirtualBox 中的 Android-x86

    我在 VirtualBox 中成功安装了 Android x86 v3 2 eeepc 一段时间 这是帮助我在 Android 上调试 USB 主机应用程序的好方法 此类配置的安装是 安装VirtualBox 将 Android x86 v
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 为什么我的地图视图上的叠加层没有显示?

    我按照 google hellomapview 教程中的说明进行操作 我得到了一个工作地图视图等 但是添加到地图中的两个项目没有显示 它们似乎在某个地方 因为点击指定位置会显示添加到项目中的消息 Edit 这是我的源代码 应该和google
  • RecyclerView 单击将数据传递到新活动

    我正在制作一个包含三个选项卡的应用程序 每个选项卡都有一个带有两个文本的 recyclerview 我希望用户能够单击任何 recyclerview 项目 并且该项目中的文本应传递到新活动 这是应用程序外观的图像 https i stack
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • 如何告诉 OkHttpClient 忽略缓存并强制从服务器刷新?

    在我的 Android 应用程序中 我将 Retrofit 与 OkHttpClient 结合使用 并启用缓存来访问某些 API 我们的一些 API 有时会返回空数据 我们在应用程序中提供了一个 刷新 按钮 供客户端从特定 API 重新加载
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Google Wallet for Digital Goods API 与 Google Play 应用内结算

    想知道 Google 电子钱包结算 API 和 Google Play 应用内结算之间有什么区别 与 Google 电子钱包结算 API 相比 使用 GooglePlay 应用内购买结算服务有何优势 我看到 Wallet API 也支持 A
  • 如何在移动应用程序上连接到服务器?

    我是移动应用程序的新手 我基本上来自网络开发平台 我只是在玩 App Framework LungoJS Jquery Mobile kendo 等移动框架 以获得该垂直领域的一些知识 我正在开发的应用程序仍然处于 UI 级别 我所需要的只
  • Android 中的 ODEX 文件是什么?

    经过一些android安装了应用程序 我发现它会变成odex文件 不是apk 在智 能手机中 这是怎么发生的 谁能教教我 我对此很感兴趣 博客文章 https stackoverflow com a 9593590 194894大部分是正确
  • 我想要有条件的登录导航,没有 MAIN 片段或按钮

    我正在使用 Android Jetpack 导航组件 实时数据和 Firebase 我希望工作流程就像用户打开应用程序时一样 然后根据登录 注销状态导航到登录 配置文件片段 而不需要任何主片段或按钮 请 我的应用程序中没有主要片段 用户启动
  • 永久删除Android文件

    我发现了一个名为这会从 Android 设备中永久删除文件和文件夹 以便删除的文件无法再恢复 这是我正在谈论的应用程序 但我想知道如何做到这一点 我知道它是用 android studio 制作的 i尝试了常规的删除方式file delet
  • 从 Dropbox 下载文件并将其保存到 SDCARD

    现在我真的很沮丧 我想从 Dropbox 下载一个文件并将该文件保存到 SD 卡中 我得到的代码为 private boolean downloadDropboxFile String dbPath File localFile throw
  • 无法解析“:feature@debugFeature/compileClasspath”的依赖关系:无法解析androidx.annotation:annotation:1.0.0-rc01

    将 Android Studio 更新到 3 3 Canary 10 从之前的 Canary 后 我开始遇到 Gradle 同步问题 ERROR Unable to resolve dependency for feature debugF

随机推荐