如何通过调用实现 Android 应用的前台服务和深度链接?带有代码示例

Android高级应用开发实践之service服务“家教”篇总结笔记【附代码)| 优快云创作打卡 Android高级应用开发实践之service服务“家教”篇总结笔记【附代码】,新手必会,老手更惠! 阅读详情

让我们看一下 Android 调用者应用程序的另外 2 个 UX 便利。首先,让我们确保应用程序在使用 Android 前台服务最小化或锁定屏幕后继续正常运行。之后,让我们看看如何使用 Deep Links 实现到呼叫或会议的直接链接。通过点击它们,智能手机用户将被直接带到通话中。

如何在 Android 上创建前台服务

今天的智能手机及其操作系统具有许多旨在延长电池寿命的内置优化。移动应用程序开发人员需要牢记系统可以对应用程序采取的潜在操作。

一个典型的例子是释放资源并关闭用户目前没有主动交互的应用程序。在这种情况下,系统仅将当前显示在用户屏幕上的应用程序视为“正在使用”。如果系统没有足够的资源供积极使用的应用程序使用,则可以随时关闭所有其他正在运行的应用程序。多亏了这一点,我们可以打开无限数量的应用程序而无需显式关闭它们——系统将关闭旧的应用程序,当我们返回它们时,应用程序将再次运行。

一般来说,这种机制在移动设备上是方便且必要的。但是我们想绕过这个限制,这样调用就不会被系统突然关闭。幸运的是,可以将应用程序的一部分“标记”为正在使用,即使它不再显示。为此,我们使用前台服务。请注意,即使这样也不能完全保护系统 - 但它增加了应用程序在系统眼中的“优先级”,并且即使Activity关闭,您也可以将一些对象保留在内存中。

添加运行此类 Android 服务的权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

让我们自己实现我们的服务。在最简单的形式中,它只是一个子类 Service,它有一个指向我们的链接CallManager(因此它不会被垃圾收集器清理):

class OngoingCallService : Service() {

    @Inject
    lateinit var abstractCallManager: AbstractCallManager

    // Implementation of an abstract method; we won’t use Bind so just return null
    override fun onBind(intent: Intent): IBinder? = null

}

Service 是一个应用程序组件,与 Activity 一样,必须在以下位置指定AndroidManifest.xml:

<service
    // Class name of our service
    android:name=".OngoingCallService"
    android:enabled="true"
    // This flag meant that other applications can’t run this service
    android:exported="false"
    // Declare a type of our service
    android:foregroundServiceType="microphone|camera|phoneCall" />

我们的 Android 前台服务的启动方式与常规服务略有不同:

private fun startForegroundService() {
    val intent = Intent(this, OngoingCallService::class.java)
    ContextCompat.startForegroundService(this, intent)
}

在 Android 8 以上的版本上,Foreground Service 必须在几秒钟内调用 startForeground 方法,否则,应用程序被认为是挂起(ANR)。有必要向此方法传递通知,因为出于安全原因,此类服务的存在应该对用户可见(如果您不知道或忘记如何创建通知,您可以在我们的其中一个中刷新您的记忆之前关于 Android 上的来电通知的文章):

val notification = getNotification()
startForeground(ONGOING_NOTIFICATION_ID, notification)

我们在这一篇文章中写的关于通知的所有内容都适用于该通知——您可以使用呼叫参与者列表对其进行更新、为其添加按钮或完全更改其设计。唯一的区别是默认情况下此通知将是ongoing默认的,用户将无法“滑动”它。

通话结束时——必须停止服务,否则只能通过设置将应用程序完全关闭,对用户来说非常不方便。我们的服务以与通常的 Android 服务相同的方式停止:

private fun stopForegroundService() {
    val intent = Intent(this, OngoingCallService::class.java)
    stopService(intent)
}

如果 CallManager 有一个响应式字段来监控调用的状态,那么启动和停止一个服务是非常方便实现的,例如:

abstractCallManager.isInCall
    .collect { if (it) startForegroundService() else stopForegroundService() }

这就是服务的整体实现,这将在一定程度上保护我们最小化的应用程序不被系统关闭。

Android 深度链接教程

一个非常人性化的功能,可以简化应用程序用户群的增长,是应用程序中某个位置的链接。如果用户没有该应用程序,该链接会在 Google Play 上打开一个页面。在呼叫应用程序的上下文中,最成功的用例是能够共享指向呼叫/会议/房间的链接。用户想与某人交谈,将链接扔给他正在与之交谈的人,该人下载应用程序,然后直接进入通话 - 还有什么更方便的呢?

系统支持指向应用程序中特定位置的链接本身,无需任何额外的库。但是为了让链接在应用程序的安装过程中“存活”下来,我们需要向 Firebase Dynamic Links 寻求帮助。

让我们专注于应用程序中链接处理的实现,并将它们的创建留给后端开发人员。

因此,Android 深度链接与代码示例。首先,让我们添加库:

dependencies {
    implementation 'com.google.firebase:firebase-dynamic-links:20.1.1'
}

对于用户来说,深层链接是他点击的普通链接。但是在浏览器中打开链接之前,系统会查看应用程序的注册表并找到那些声明它们处理该域的链接的应用程序。如果找到这样的应用程序 - 它不会在浏览器中打开,而是启动相同的应用程序并将链接传递给它。如果有多个这样的应用程序 - 系统窗口将显示一个列表,用户可以在其中选择打开链接的应用程序。如果您拥有链接域,则可以保护自己在安装您的应用程序时不被其他应用程序打开此类链接。

要声明我们的应用可以处理的链接,我们需要在以下位置添加Activity一个意图过滤器AndroidManifest.xml:

<activity ...>
    <intent-filter>
        // These action and category notify the system that we can “display” the links
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        // Description of the link which we can handle. In this case these are the links starting from calls://forasoft.com
        <data
            android:host="forasoft.com"
            android:scheme="calls"/>
    </intent-filter>
</activity>

当用户单击动态链接并安装应用程序(或单击已安装应用程序的链接)时,Activity 将启动,并显示为该链接的处理程序。在这个Activity中,我们可以这样获取链接:

Firebase.dynamicLinks
        .getDynamicLink(intent)
        .addOnSuccessListener(this) { data ->
            val deepLink: Uri? = data?.link
        }

使用常规深度链接时,数据会变得更简单一些:

val deepLink = intent?.data

就是这样,现在我们剩下的就是从链接中获取我们感兴趣的参数,并在您的应用程序中执行连接到调用所必需的操作:

  val meetindId = deepLink?.getQueryParameter("meetingid")
        if (meetingId != null) abstractCallManager.joinMeeting(meetingId)

结论

在我们周期的最后一篇文章“每个带有调用的应用程序应该具有什么”中,我们已经完成了在最小化应用程序并使用深度链接作为调用调用邀请的便捷选项之后保持应用程序的活动。现在您知道了不仅在应用程序内部而且在系统级别使用户体验更好的所有机制。

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

需要资料的朋友可以文末的微信卡片即可免费领取
android:foregroundServiceType=“microphone“使用报错 本文主要整合下tkinter ,实现下简单的计算器. 阅读详情

相关推荐

手把手教你用AppsFlyer SDK实现延迟深度链接(附Android/iOS代码示例)

本文详细介绍了如何使用AppsFlyer SDK实现延迟深度链接,提供Android和iOS双平台代码示例,帮助开发者解决跨平台精准跳转与用户归因问题。通过实战案例和高级场景分析,提升应用的用户转化率和广告投放效果。

sre5engineer的博客 704

Android 14适配

Android 14适配。

且听真言 1万+

uniapp实战:如何实现安卓和iOS应用商店跳转(附完整代码示例)

本文深入解析了在Uniapp中实现安卓与iOS应用商店跳转的完整方案。针对安卓平台商店多样性和iOS平台统一性的差异,提供了从底层原理、核心代码实现到处理复杂场景(如安卓商店劫持、H5兼容)的实战指南,并附带了可直接复用的工具函数和组件化示例,帮助开发者构建稳定、用户体验良好的应用评分与引导功能。

chair的专栏 480

Android 息屏录音

解决Android录音的息屏之后无法录制声音的问题,看日志发现,录音程序并没有中断,但是录制到的数据均是byte为0的数据,即空数据。测试机为Android 13系统。

qq_33601179的博客 1653

【1】安卓上部署深度学习模型【MNN,NCNN】

深度学习模型部署到安卓上实例

qq_33596242的博客 6291

React Native深度链接:实现应用内跳转与网页唤醒

在移动应用开发中,深度链接是一个非常重要的功能。它可以让用户从网页或者其他应用直接跳转到我们应用内的特定页面,大大提升了用户体验。本文的目的就是详细介绍在React Native中如何实现深度链接,包括应用内跳转和网页唤醒功能,范围涵盖核心概念的解释、实现原理的分析、具体代码的实现以及实际应用场景的探讨。本文将首先介绍深度链接的核心概念,包括相关术语和概念的解释。然后详细阐述核心概念之间的关系,并给出原理和架构的文本示意图以及Mermaid流程图。

AI架构全栈开发实战笔记 1217

深度链接和延迟深度链接的学习

Deeplink”又名“深度链接”,是一种能将用户直接从网页带到App指定页面的技术。

qq_58259539的博客 2931

手把手教你实现App深度链接跳转

在当今的移动应用开发中,App深度链接跳转是一项非常实用的功能。它可以让用户在点击一个链接后,直接跳转到App内的特定页面,而不是仅仅打开App的首页。本文章的目的就是详细地教大家如何实现这一功能,范围涵盖了Android和iOS两个主流移动平台。本文首先会介绍相关的核心概念,让大家对App深度链接跳转有一个清晰的认识。接着会讲解核心算法原理和具体操作步骤,包括代码实现。然后通过项目实战,展示如何在实际项目中运用这些知识。之后会介绍实际应用场景、推荐相关工具和资源,分析未来发展趋势与挑战。

移动开发前沿的博客 1172

Android 深层链接DeepLink和应用链接AppLink:实现浏览器跳转 app

1. 场景 很多app (如电商类app: 某宝、某东等)为了引流或者增加曝光率,在浏览器、邮件、信息等地方点击一条链接就能打开app。如:一些浏览器网页上挂着一些商品链接,点开链接,在链接的详情会提示打开app或者下载app。如果本地有安装app,则直接可以打开本地app 的商品页面。 2. 实现技术 深层链接 或者 Android 应用链接 3. 例子实现效果 4. 深层链接实现: 4.1 添加 Intent 过滤器 从浏览器调起用的链接会跟 Android 系统 Intent 进行匹配。若本地应用存在

二进制的博客 1万+

如何用TensorFlow在安卓设备上实现深度学习推断

在 Insight 任职期间,我用 TensorFlow 在安卓上部署了一个预训练的 WaveNet 模型。我的目标是探索将深度学习模型部署到设备上并使之工作的工程挑战!这篇文章简要介绍了如何用 TensorFlow 在安卓上构建一个通用的语音到文本识别应用程序。 作者:李亚洲 对于个人和公司来说,存在许多状况是更希望在本地设备上做深度学习推断的:想象一下当你在旅行途中没有可靠的互联网链接时,

人工智能爱好者俱乐部 4208

Android Service的实现详细过程

需要注意的是,Service默认运行在主线程中,如果需要在Service中执行耗时任务,应该创建新的线程或使用AsyncTask等异步操作方式,以免阻塞主线程导致ANR(Application Not Responding)错误。接下来,创建一个新的Java类,命名为MyService,继承自android.app.Service类。在Android开发中,Service是一种可以在后台运行的组件,用于执行长时间运行的任务或处理不需要与用户界面交互的操作。Android Service的实现详细过程。

CodeLancerX的博客 226

Android应用深度链接开发指南 - 从原理到实践

Android应用深度链接开发指南 - 从原理到实践 深度链接(Deep Linking)是现代移动应用开发中非常重要的技术,它允许用户通过点击链接直接跳转到应用内的特定内容页面。本文将全面讲解如何在Android应用中实现深度链接功能,帮助开发者提升用户体验和应用的可发现性。 深度链接的核心概念 深度链接本质上是一种特殊的URI(统一资源标识符),它不仅能打开应用,还能直接导航到应用内的特定位置...

gitblog_01185的博客 519

Sigrity XtractIM实战:5步搞定IC封装宽带模型提取(附BGA案例)

本文通过一个典型BGA封装案例,详细介绍了使用Cadence Sigrity XtractIM工具进行IC封装宽带模型提取的五步实战流程。内容涵盖从环境准备、参数设置、结果验证到模型导出的完整操作,重点阐述了如何利用XtractIM生成高精度、紧凑的宽带SPICE模型,以解决高速电路设计中因封装模型不准导致的信号与电源完整性问题,助力工程师提升仿真精度与设计效率。

a1b2c的博客 320

Android深度链接终极指南:如何在应用中配置intent-filter实现无缝跳转

深度链接(Deep Linking)是Android应用开发中的重要技术,它允许用户通过URL链接直接跳转到应用内的特定页面。在UltimateAndroidReference项目中,我们提供了完整的深度链接配置示例,帮助开发者实现更流畅的用户体验。 ## 🎯 深度链接的核心概念 深度链接让应用能够响应特定的URL模式,当用户点击这些链接时,系统会自动打开你的应用并导航到相应内容。这对于电商

gitblog_01191的博客 1130

完整内、外期货量化交易系统源码可售

支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息;

qq_35600909的博客 1805

亚马逊(Amazon ads)广告API申请步骤(已经更新完)

你如果是自己的店铺使用,就选择左边的、如果是授权的那种给别人用就选右边的。审核通过了才能进行下一步,我目前就是刚申请完,后续会持续更新!然后会调整到,下面的页面,选择Agency然后右上角点击创建。审核通过会发邮件到你的企业邮箱、时间大概是1-7天左右。输入对应的信息,点击提交审核,就可以开始申请了。1、广告平台跟卖家平台是分开的,这个概念要清楚。2、注册广告一定要用企业邮箱!回到首页,点击成为合作伙伴。注册了以后会跳转到广告。然后再点击加入合作伙伴。然后会弹出下面的页面。

阿泽的博客 5658

android中深度链接的实现

在讲今天主题之前,不知道大家有没有遇到这种情况,产品经理要做这么一个需求,要求外部链接跳转到app页面?又或者指定页面或者带参数? 这里就涉及到一个深度链接的概念,首先我们从第一步开始 ###注册事件监听 这里需要使用到 Android Activity中的 ,现在可以创建一个解析跳转的 Activity,名字随便取了,然后需要在 Manifest 文件中配置具体的 <intent-f...

u013285894的博客 1185

人形机器人触觉革命:压电式电子皮肤的多模态感知与自修复技术突破

本文深入探讨了压电式电子皮肤如何推动人形机器人的触觉革命。文章分析了其基于压电效应的多模态感知原理,能够灵敏检测压力、振动与温度,并重点介绍了赋予电子皮肤自修复能力的动态共价网络等前沿材料技术,从而极大提升了机器人与物理世界进行精细、安全交互的可靠性与智能化水平。

weixin_29251567的博客 194

在 iOS 与 Android 上实现 React Native 应用深度链接,通过 URL 打开到指定页面

在 iOS 与 Android 上实现 React Native 应用深度链接,使得应用可以通过 我们生活在一个万物兼可分享的年代,而分享的过程,几乎最终都会分享某一个链接,那么,作为开发者,最常遇到的问题中应该包括如何通过一个URL地址快速的打开App,并导航至特定的页面。 什么是深度链接(Deep Link) 深度链接是一项可以让一个App通过一个URL地址打开,之后导航至特定页面或者资源,或者展示特定UI的技术,Deep 的意思是指被打开的页面或者资源并不是App的首页,最常使用到的地方包括但远远不限

AAjjx的博客 1145

Python 使用Pygame库实现足球游戏:创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理

本文将介绍如何使用Python和Pygame库创建一个简单的足球游戏。我们将搭建一个基本的游戏环境,创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理。这个简单的足球游戏展示了Pygame的一些基本功能。虽然这是一个简单的游戏,但它包含了创建游戏循环、用户输入处理、物理模拟、碰撞检测等重要概念。

程序熊的博客 743

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8868

android mvp示例_Android深层链接示例

In this tutorial you will learn about android deep linking with an example. 在本教程中,您将通过示例了解android深度链接。 In deep linking first we have to understand what does an URI means. Let us consider an example ...

culing2941的博客 324

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2875

AListFlutter后台服务实现原理:Android Service深度剖析

AListFlutter作为AList的安卓版本,实现了APK安装即用、无需Root或Termux的便捷体验,其核心功能依赖于Android Service组件实现后台服务的稳定运行。本文将深入剖析AListFlutter如何利用Android Service构建持久化后台服务,以及其与AList核心功能的整合机制。 ## 一、Android Service基础架构 AListFlutter的

gitblog_00249的博客 1090

相似贴子推荐:基于 LangChain4j + Milvus 的混合检索实战

本文提出了一种基于LangChain4j和Milvus的混合检索方案,用于解决论坛社区中的相似帖子推荐问题。该方案结合稠密向量语义检索和BM25关键词检索的优势,通过RRF算法实现结果融合。系统采用bge-small-zh模型生成语义向量,利用Milvus 2.5+原生支持的BM25功能和混合搜索API,在百万级数据规模下实现50ms内的检索延迟,召回率和精确率分别提升15%和22%。文章详细介绍了从数据预处理、向量化到混合检索的完整实现流程,并探讨了进阶优化方向,为推荐系统和RAG应用提供了高效解决方案。

分享AI、区块链技术及应用,未来已来 89

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Clean Architecture - 规划和初始设置
下一篇: 使用 Jetpack Compose 自动截取 Android 应用程序的屏幕截图
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值