Android架构组件LiveData - 如何将broadcastReceivers绑定到生命周期

2023-12-24

使用安卓LiveData https://developer.android.com/reference/android/arch/lifecycle/LiveData.html我希望能够取消注册并注册许多BroadcastReceiver是在onInactive() and onActive()回电。所以我想做这样的事情:

public class BroadcastRecieverLiveData extends LiveData<BroadCastReciever> {
    private BroadcastReciever reciever;
    private Context context;

    public BroadcastRecieverLiveData(Context context) {
        this.context = context;
    }

    @Override
    protected void onActive() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("SOME_ACTION");
        filter.addAction("SOME_OTHER_ACTION");

        reciever = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //do something based on the intent's action
            }
        };
        registerReceiver(reciever, filter);
    }

    @Override
    protected void onInactive() {
        if (reciever != null) {
            context.unregisterReceiver(reciever);
        }
    }
}

我认为这可能是一种清理代码而不是依赖的设计模式onDestroy。您对于以这种方式使用 LiveData 有什么想法?有一个使用它的例子here https://developer.android.com/topic/libraries/architecture/livedata.html


我认为对于接收者来说,你应该实施LifecycleObserver。 按照LiveData来自谷歌的文档codelab https://codelabs.developers.google.com/codelabs/android-lifecycles/index.html?index=..%2F..%2Findex#0,

注意:在 ViewModel 中存储对 Context 或 View 的引用可以 导致内存泄漏。避免引用实例的字段 上下文或视图类。 onCleared() 方法很有用 取消订阅或清除对其他较长对象的引用 生命周期,但不适用于清除对 Context 或 View 对象的引用。

因此,您不应该在 LiveData 中进行上下文密集型操作。

相反,以下面的实现为例,

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

public class ReceiverManager implements LifecycleObserver {

    private final Context mContext;
    private final MyBrodacastReceiver myBrodacastReceiver;

    public ReceiverManager(LifecycleOwner lifecycleOwner,
                           Context context) {
        mContext = context;
        myBrodacastReceiver = new MyBrodacastReceiver();
        lifecycleOwner.getLifecycle().addObserver(this);

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void registerYourReceiver() {
        mContext.registerReceiver(myBrodacastReceiver, new IntentFilter());
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void unRegisterYourReceiver() {
        mContext.unregisterReceiver(myBrodacastReceiver);
    }

    private static class MyBrodacastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

        }
    }
}

Thanks.

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

Android架构组件LiveData - 如何将broadcastReceivers绑定到生命周期 的相关文章

  • 为什么 cordova.file.documentsDirectory 为空?

    我正在尝试使用 cordova plugin file transfer 在http ngcordova com docs plugins fileTransfer http ngcordova com docs plugins fileT
  • 不同 Android 设备上 box2D 中出现奇怪的“口吃”

    我正在用 C 同时开发引擎和游戏 并使用 box2D 作为物理后端 我正在不同的 Android 设备上进行测试 在三分之二的设备上 游戏运行良好 物理效果也很好 然而 在我的 Galaxy Tab 10 1 上 我偶尔会遇到某种 口吃 的
  • Kapt 未在即时应用程序功能模块中生成类

    我在我的 Android 应用程序中使用 dagger2 即使没有错误 它也不会生成匕首组件类 我已经在设置中启用了注释处理器并重新启动了我的 android studio 但这对我来说不起作用 我也读过这个帖子Dagger2 不生成 Da
  • 使用 GoogleServices 插件时忽略 Gradle ArchivesBaseName

    我经常使用 archivesbasename 来重命名我的输出 apk 但自从使用 google services 插件后 它就被忽略了 我能做些什么来让它再次工作吗 下面附上了我完整的 build gradle 感谢您的指点 apply
  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • android 多关键词搜索

    我的应用程序包含搜索功能 它将搜索数据库内的内容 我的搜索的弱点是 我只能使用一个标签进行搜索 例如我只能搜索 猫 它会返回我的数据库中包含 猫 一词的内容 因为我正在使用LIKE在 select 语句期间进行查询 如何使用多个标签进行搜索
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • 如何在Android网格视图中设置单元格大小?

    我正在尝试为应用程序制作一个带有大图标的网格视图 但我找不到任何有关修改 Android 上网格布局上的单元格大小的教程 有人可以给我一个例子或相关链接吗 Thanks 就像另一个一样适配器视图 http developer android
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • Android复杂布局线性和相对

    I have to implement a layout like shown in the diagram and I do not know the best combination to achieve the required de
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player

随机推荐

  • 在 Express 中监听 UDP 消息

    我有一个使用 Express 的基本 Node js 服务器 它需要能够处理 TCP 消息以及 UDP 消息 TCP 部分已启动并运行良好 但现在我需要集成一种嗅探 UDP 消息的方法 我尝试使用以下方法将处理程序添加到过滤器堆栈中dgra
  • java中的toArray与stream.toArray有什么性能差异

    我需要将 ids 列表转换为 ids 数组 我可以通过多种方式做到这一点 但不确定应该使用哪一种 Say 1 ids stream toArray Id new 2 ids toArray new Id ids length 哪一种更有效
  • 使用 XmlDocument 保留 xml 格式

    我正在使用 XmlDocument 来处理 xml 如何使用当前格式保存 XmlDocument 当前格式
  • pdb 绕过错误/跳转失败:只能从“行”跟踪事件跳转

    我正在尝试使用 pdb 调试 Python 程序 程序可能是这样的 def main a 1 print b c 2 d 3 显然 print b 是一个拼写错误 应该是 print a 但这并不重要 我可以用文本编辑器修复它 但我想绕过这
  • Linux系统上打印文件的uid

    我正在学习c编程 我正在尝试让我自己的程序类似于ls命令但选项较少 我正在做的是将输入目录 文件名作为参数 然后获取所有目录条目direntstruct 如果是目录 之后我使用 stat 获取文件的所有信息 但是当我使用 write 打印这
  • Node.js:类型错误:对象不是函数

    我有一个奇怪的错误 var http require http var request require request http createServer function request response response writeHe
  • 如何高效替换XML的多个节点?

    我试图一次性替换单个文档的大约 500 个节点 并且我的数据库中有 5000 多个文档 我正在使用的代码与我之前问过的这个问题相关 Link https stackoverflow com questions 51998598 how to
  • EJB3.1 系统异常与 javax.ejb.EJBException

    在提出我的问题之前 先介绍一下 EJB3 1 异常的背景知识 应用程序例外包括 用户定义的已检查或未检查异常 ApplicationException注解 所有已检查的异常 java lang Exception及其子类异常 除了 java
  • 更改 IP 地址后 Riak 节点不再工作

    我使用实例化 Amazon EC2 虚拟 Ubuntu 12 04 服务器作为我的单个 Riak 节点 我已经使用 basho 网站上的指南完成了在实例上设置 Riak 的所有正确阶段here http docs basho com ria
  • 使用 Queue::fake() 测试监听器

    我的 Laravel 5 5 应用程序有一个Product模型 这Product模型有一个dispatchesEvents属性看起来像这样 The event map for the model var array protected di
  • 内存使用量指标标识符 Google Compute Engine

    我已经在我的实例组磁盘中安装了监控代理 我需要根据内存使用情况自动缩放实例 但是当我要在 GCE Web 控制台中配置目标指标时 我错过了内存使用指标标识符 缺少哪个标识符或者如何根据内存使用情况自动缩放我的组 None
  • 反应式编程的优点/缺点

    我不断研究和尝试使用 Reactor 和 RxJava 的响应式编码 我确实明白 与单线程执行相比 反应式编码可以更好地利用 CPU 在基于 Web 的应用程序中 反应式编程与命令式编程之间有具体的比较吗 与非反应式编程相比 使用反应式编程
  • 如何防止 BIDS 自动签出 SSIS 包?

    当编辑文件时 我将 Visual Studio 2005 BIDS 设置为 自动签出 这对于大多数文件类型都适用 但是 当我访问 SSIS 包中的数据流时 会触发签出 而无需我进行任何更改 当我比较这些文件时 后台似乎也没有进行任何更改 这
  • sql server 如何在有多个选项的更新语句中选择值?

    我在 SQL Server 中有一个更新语句 其中可以根据连接分配四个可能的值 SQL 似乎有一种算法可以选择一个值而不是另一个值 但我不确定该算法是如何工作的 举个例子 假设有一个名为 Source 的表 其中有两列 匹配和数据 结构如下
  • MongoDB Mongoose 选择日期范围内的文档

    我有一个名为events 示例文档是这样的 我想选择日期范围内的文档 2019 01 11 to 2019 11 27 我所做的就是这个 但这似乎不起作用 我如何实现这个使用MongoDB Mongoose match createdAt
  • 有没有办法阻止 EF 插入 SQL Server 计算列?

    我不希望 EF 在从数据库检索记录时忽略类上的列 因为我需要能够比较计算列 但我不希望 EF 尝试将值插入到该列中 因为这会抛出异常SQL 异常 因为无法修改计算列 您可以使用数据库生成 https learn microsoft com
  • MockRestServiceServer:如何用主体模拟 POST 调用?

    我试图用以下方式模拟 POST 方法MockRestServiceServer通过以下方式 MockRestServiceServer server bindTo restTemplate build server expect reque
  • R语言中使用getURL()函数返回错误

    我已经开始学习数据科学并且刚接触 R 语言 我正在尝试从下面读取数据使用 getURL 函数和 Rcurl 包的 HTTPS URL 在执行下面的代码时 接收SSL协议问题 R Code 加载库 Rcurl 库 RCurl 指定 Iris
  • 将连续的后代节点合并为一个

    XML
  • Android架构组件LiveData - 如何将broadcastReceivers绑定到生命周期

    使用安卓LiveData https developer android com reference android arch lifecycle LiveData html我希望能够取消注册并注册许多BroadcastReceiver是在