草庐IT

android - 寻求外行对未决 Intent 概念的解释

coder 2023-12-15 原文

这是一个相当陈旧的问题,但坦率地说,我还没有找到满足我好奇心的答案。

亲爱的读者,在你跳转到 android 开发人员引用以粘贴文本之前,请注意我已经阅读了 Intent/Pending Intent 文档并且尚未解决我的困惑。

Intent 模型是 android 系统的核心,因此非常通用,这让我印象深刻。正因为如此,我看到的关于它的用法的例子往往是多种多样的。这种变体混淆了我试图学习的概念,这令人沮丧。

我的问题很简单,但可能很难用简单的术语解释。我知道 Intent 是给其他 Activity 的消息,其他 Activity 可以在 list 中声明他们的兴趣。待定 Intent , Intent 的包装,让我感到困惑。

  1. 我看到有关权限和 token 的文档。我明白了,但为什么需要将未决 Intent 作为一个单独的实体 - 它支持什么行为?
  2. 未决 Intent 会导致哪些 Activity/任务生命周期行为?
  3. 什么时候需要广播接收器?
  4. 广播接收器的局限性是什么?

我意识到这些是非常新的问题(我也是),但我非常想了解这些核心概念,这样我就不必过多地依赖示例/指南/官方文档。

欢迎任何反馈。谢谢。

最佳答案

PendingIntent 的主要目的是授予另一个应用程序书面许可,让其代替您做某事。应用程序在允许执行的操作方面受到限制,本质上,这两个因素:

  • 可见性。其他应用程序无法调用未提供公开可见(或任何) Intent 过滤器的服务或 Activity 等组件。它们只能由您的应用程序使用指定其包和类名称的显式 Intent 调用。
  • 权限。每个应用程序都可以请求一定数量的权限。这些大多是预定义的权限,但您也可以选择定义自己的权限,尽管我从未使用过。您的应用程序不能做任何超出这些权限的事情。

现在,对于未决 Intent ,如果应用程序具有执行某些操作所需的权限和可见性,则您可以克服这两个限制,特别允许执行它代替了她。例如,如果应用程序为您提供了一个包含针对所述 Activity 的显式 Intent 的未决 Intent ,则该应用程序可以允许您调用她的一个私有(private) Activity 。

[编辑] 例如,它们与警报管理器一起使用。它通过给它一个(未决的) Intent 告诉警报管理器做什么和什么时候做。由于您的应用程序可能在时间到来时不再存在,因此警报管理器将不得不为您发送它。这意味着这些 Intent 只能做报警管理器被允许做的事情,而不是你的应用程序被允许做的事情。如果允许警报管理器简单地做任何事情,那么每个应用程序都可以通过使用警报管理器作为代理来做任何事情。因此,您必须使用挂起的 Intent 来专门授予警报管理器您的特定 Intent 所需的权限。[/edit]

除此之外,与常规 Intent 没有太大区别,至少就用法而言是这样。它确实因粘性 Intent 等而变得有点复杂,但这是它的一般要点,至少据我所知是这样。

当您想对某些 system events 使用react时,需要一个广播接收器。 ,或其他应用程序的事件。广播接收器是不可见的,它不会创建任何形式的 View ,也不涉及任何形式的用户交互。优点是无论您的应用程序(或者更确切地说,您的 Activity )当前是否正在运行,这都可能发生。

广播接收器只被授予大约 10 秒的时间来做一些事情,之后它就会被系统杀死。因此,如果您想执行任何类型的长时间运行的流程,您将不得不使用后台服务,或打开一个 Activity 让您的用户做一些事情。

关于android - 寻求外行对未决 Intent 概念的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11012557/

有关android - 寻求外行对未决 Intent 概念的解释的更多相关文章

  1. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

  4. 语法类似于 GitHub Flavored Markdown 的 Ruby markdown 解释器? - 2

    我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong

  5. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  6. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  7. Ruby 代码解释 - 2

    谁能解释一下这段Ruby代码:defadd_spec_path_to(args)#:nodoc:args我看到了运算符用于连接字符串或在其他语言中用作按位运算符,但有人可以在这种情况下对其进行解释。它是以某种方式将一个空白的lamda附加到args上还是我完全错了?我还可以看到它是这样使用的:before_parts(*args)是Hash关键字?我也不确定||=是什么接线员在说。我同样对什么一无所知caller(0)[2]是。 最佳答案 我假设args是一个Array。Hash是类的名称-第一行将空哈希{}推送到argsunles

  8. python - 解释性语言中的链接和加载 - 2

    在编译型语言中,源代码由编译器转化为目标代码,不同的目标文件(如果有多个文件)由链接器链接并由加载器加载到内存中执行。如果我有一个使用解释性语言(例如ruby​​或python)编写的应用程序,并且如果源代码跨多个文件拆分,那么这些文件究竟何时组合在一起。换句话说,链接何时完成?解释型语言一开始就有链接器和加载器,还是解释器包揽一切?我真的很困惑,无法理解它!!谁能对此有所启发?! 最佳答案 解释型语言或多或少是可执行文件的大型配置,称为解释器。该可执行文件(例如/usr/bin/python)是实际运行的程序。然后它读取它要执行的

  9. ruby - 解释型语言(如 Ruby)如何运行? - 2

    我打算学习Ruby。我知道这是一种解释语言。我知道编译语言最终会被翻译成机器码,但是ruby​​解释器是做什么的呢?我读到解释器是用C编写的,但是每一行ruby​​都转换为c,然后再次编译为机器代码吗?我也听说过JIT,但是如果这会增加答案的复杂性,那么您就不需要回答它了。我正在寻找的是我的Ruby代码发生了什么。 最佳答案 它将Ruby代码转换为某种更简单的“中间”表示形式(在最近的版本中,它编译为字节码)。它还会在您计算机的内存中构建一个虚拟机,模拟执行该表示的物理机。这台机器是一台物理机器的镜像,至少在合理和有用的范围内。它通

  10. WebSocket的那些事(1-概念篇) - 2

    目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli

随机推荐