Android开发-Android uri使用一例:一个app启动另外一个app,以及使用PackageManager中getLaunchIntentForPackage来进行App的信息的获取

Android 唤醒应用程序,一个APP唤醒另一个APP,A应用调用B应用Activity,两个APP间传递数据 注:将A作为当前应用,B作为要被唤醒的应用 B应用需要在manifest文件对应Activity添加 android:exported="true" 方式一:getLaunchIntentForPackage唤醒 这种方式会启动要唤醒的app程序,相当于启动了B应用,进入其启动页。 "com.test.wakedemo2"为应用的包名。 //A应用中唤醒部分代码逻辑 Intent intent = getPackageManager().getLaunchIntentForPackage("co 阅读详情

内容简介:

本文探讨两个小功能的实现:

1. 如何由一个app(App1)启动另外一个app(App2)?
2. 在App2中,如何知道自己是被App1启动的?

1.  App1启动App2:

在Android应用程序开发时,如果想由一个App启动另外一个App,可以使用Uri这个类来实现。

Url - 统一资源定位符,位于android.net.Uri。可见,Uri是Android系统中才有的,事实上,Uri是Url的扩展。

一个App启动另外一个App非常容易实现,代码如下:

Intent intent = new Intent();
ComponentName cn = new ComponentName("com.a.b.app1", "com.test.app2.activity.OneActivity");
intent.setComponent(cn);
Uri uri = Uri.parse("com.test.app2.activity.OneActivity");
intent.setData(uri);
context.startActivity(intent);

这样,就启动了App2的MainActivity了。

说明:
1). ComponentName的第一个参数是App2的包名,第二个参数是App2中的入口Activity;
2). Uri.parse的参数是App2的入口Activity;
2). 在App2中,AndroidManifest文件必须指定MAIN和LAUNCHER两个Action,声明如下:

<activity android:name="com.test.app2.activity.MainActivity"

    ......

    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

</activity>


2. 利用PackageManager中getLaunchIntentForPackage来进行App的信息的获取:

在App2中,如何知道自己是被App1启动的?可以通过PackageManager中getLaunchIntentForPackage方法来实现。代码如下:

PackageManager packageManager = getPackageManager();
Intent intent =packageManager.getLaunchIntentForPackage("com.a.b.app1");

if(intent!=null){
    Toast.makeText(mContext,"Package found success!!!",Toast.LENGTH_SHORT).show();
}else {
    Toast.makeText(mContext,"Package not found!!!",Toast.LENGTH_SHORT).show();
}

代码简单分析如下:

代码本身很简单,来看一下getLaunchIntentForPackage方法的具体实现。

PackageManager本身是一个抽象类,Android提供了

final class ApplicationPackageManager extends PackageManager 

可见,ApplicationPackageManager是PackageManager的派生类,而且不可以再被继承。

在ApplicationPackageManager中,getLaunchIntentForPackage方法的实现如下:

@Override
    public Intent getLaunchIntentForPackage(String packageName) {
        // First see if the package has an INFO activity; the existence of
        // such an activity is implied to be the desired front-door for the
        // overall package (such as if it has multiple launcher entries).
        Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
        intentToResolve.addCategory(Intent.CATEGORY_INFO);
        intentToResolve.setPackage(packageName);
        List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);

        // Otherwise, try to find a main launcher activity.
        if (ris == null || ris.size() <= 0) {
            // reuse the intent instance
            intentToResolve.removeCategory(Intent.CATEGORY_INFO);
            intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
            intentToResolve.setPackage(packageName);
            ris = queryIntentActivities(intentToResolve, 0);
        }
        if (ris == null || ris.size() <= 0) {
            return null;
        }
        Intent intent = new Intent(intentToResolve);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClassName(ris.get(0).activityInfo.packageName,
                ris.get(0).activityInfo.name);
        return intent;
    }

代码说明,

先通过Intent.ACTION_MAIN来查询app1的包名对应的Activity信息,

new Intent(Intent.ACTION_MAIN);  //设定了MAIN,

List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);

如果找不到,再主动设置ACTION_MAIN和CATEGORY_LAUNCHER,再查询:

intentToResolve.setPackage(packageName); //进行了包名的设置;

intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER); //又设定了launcher。

ris = queryIntentActivities(intentToResolve, 0);

如果能找到对应的packageName,则返回相应的Intent;这样一来,在App2中,就可以根据这个Intent来获取相应的App1的信息了。


Android游戏启动器开发指南:以Minecraft基岩版为例解析LeviLauncher核心实现 游戏启动器是连接玩家与游戏客户端的核心枢纽,其本质是一个具备特定业务逻辑的Android应用。从技术原理上看,它通过PackageManager检测应用安装状态,并利用Intent机制启动目标游戏进程。对于《我的世界》这类沙盒游戏,启动器的技术价值在于实现了多版本管理、模组加载和资源包切换等复杂功能,从而显著提升游戏的可定制性和管理效率。在应用场景上,这类启动器广泛服务于需要管理多个游戏实例、自定义模组生态的玩家社区。以LeviLauncher为代表的现代化启动器,正是通过构建游戏实例数据模型、实现版本清单 阅读详情

相关推荐

【android】am force-stop杀死app后,然后用getLaunchIntentForPackage唤醒失败,解决办法

am force-stop杀死app后,然后用getLaunchIntentForPackage唤醒失败 SuUtil.kill(ConstantUtil.PACKAGE_NAME); /** * 跳转第三方APP唤醒---失效 */ PackageManager packageManager = getPackageManager(); if (PackageUtil.checkPackInfo(this,ConstantUtil.PAC

weixin_48618536的博客 1877

Android 必知必会 - 使用 Intent 打开第三方应用及验证可用性

本文主要记录: 使用 Intent 打开第三方应用或指定 Activity 的三种方式 使用上面三种方式时分别如何判断该 Intent 能否被解析 判断该 Intent 能否被解析中可能出现的遗漏

他叫自己Mr.张 4597

Android中通过外部程序启动App的三种方法

第一种:直接通过包名: 代码如下: Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(“com.joyodream.jiji”);                 startActivity(LaunchIntent);   第二种:通过自定义的Action 代码如下: Intent intent = new Intent();                 intent.setAction(“com.joyodream.jiji.main”);                 MainActivity

小心 getLaunchIntentForPackage() 方法

应用中响应 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 在本文中称为主界面。 本文基于 Android O 问题现象 用PackageInstaller安装应用,在安装完成界面里点击打开,应用闪屏页打开后,按Home键回到桌面,点击桌面里的应用图标。 问题点:再打开一个闪屏页。 问题原因 应用中启动别的应用,以...

weixin_34335458的博客 1万+

告别Root!用Termux+ADB在Android上玩转自动化(保姆级教程)

本文详细介绍了如何在非Root环境下使用Termux和ADB实现Android自动化操作,无需Root权限即可运行自动化脚本。通过Termux搭建Linux终端环境,结合ADB无线调试和Python脚本,实现点击、滑动、截图等自动化功能,适用于定时任务、自动签到等场景。

weixin_42548888的博客 540

图生文【学习中】

图生文:提供图像,把图像对应的信息用文本描述出来

qq_19072921的博客 1787

显示android设备所以已安装App 可点击启动、搜索

获取android设备已安装的所有app并列表展示,app名称*表示此app是系统应用,此activity无需任何xml文件

我的blog 948

vue3(微信公众号H5网页):调用wx.config报错config:fail,invalid signature,在vue3 h5项目开发微信内置浏览器JS-SDK/JS-API提示签名失效/错误

微信公众号网页,vue3 H5网页,uniapp h5,wx.config 报错:config:fail,invalid signature?无效签名,微信JSSDK分享接口中wx.config 出现invalid signature问题的解决办法,微信公众号签名失效,wx.config中出现invalid signature的解决方法,H5页面调起微信的拍照与分享功能,导致的config:invalid signature这个错误的解决办法,微信网页调用分享功能出现config:fail,invalid

✅ 精选推荐文章 5052

移动端应用间跳转:Android与iOS的URI Scheme与Universal Links实现

应用间通信是移动开发中的基础技术,它允许不同应用之间安全地传递数据和功能。其核心原理是通过操作系统提供的URI Scheme或Universal Links/App Links机制,实现应用间的相互唤醒与跳转。这项技术的价值在于能够打破应用孤岛,实现跨应用的功能互补与用户体验的无缝衔接,例如常见的跨应用登录、内容分享和营销活动引流等场景。在Android平台上,主要通过Intent和自定义URI Scheme实现;而在iOS平台,则经历了从自定义URL Scheme到更安全、体验更好的Universal L

weixin_33851604的博客 481

Python爬虫实战:全自动采集银行理财产品收益率数据

本文通过Playwright动态爬虫技术,成功实现了对银行理财产品收益率数据的实时采集,并通过 Pandas 数据清洗、SQLite 存储、调度自动化等模块,构建了一个可扩展的银行理财数据抓取系统。理财非儿戏,数据做决策。掌握银行收益信息是我们迈向理性投资的第一步。希望这套工具对你有所帮助!

2201_76125261的博客 1156

药物对接仿真软件:HADDOCK_(3).分子对接基本原理

分子对接(Molecular Docking)是计算化学和结构生物学中的一种重要技术,用于预测小分子(如药物分子)与大分子(如蛋白质)之间的相互作用模式和结合亲和力。这一技术在药物设计和开发中具有广泛的应用,尤其是在寻找和优化潜在的药物候选物方面。本节将详细介绍分子对接的基本原理,包括其理论基础、计算方法和应用。

kkchenjj的博客 1170

app跳转

app跳转的2中方式

weixin_45877710的博客 221

实现基于 Python 和 xterm.js 的 Web 交互终端demo

前端 (HTML):使用 xterm.js 作为前端终端模拟器库。创建了一个 WebSocket 连接到 ws://localhost:8765,这与后端服务器的地址和端口匹配。监听 WebSocket 消息,并将数据写入终端。同时监听用户输入并发送到服务器。后端 (Python):使用 websockets 库来创建 WebSocket 服务器,监听端口 8765。使用 paramiko 库来创建 SSH 客户端并连接到指定的远程服务器。

u010674101的专栏 876

Android 从一个应用跳转到另外一个应用

公司自主研发的项目。需要相互关联,资源共享,就需要应用的项目跳转,其实很简单,方法也有很多。 方法一: try { PackageManager packageManager = getPackageManager(); Intent intent= new Intent(); intent = packageManager.getLaunchIntentFor

爱哭的毛毛虫 4076

添加USB wifi驱动到RK3568

在日常开发中我们经常需要用到wifi功能,一般来说soc厂家都会事先做好了几个厂家的wifi驱动在内核源码目录下,我们只需要按原理图配置对应的设备树即可。常用的wifi的接口有:USBSDIOPCIE下面来介绍这这种接口是如何使用wifi芯片。提示:以下是本篇文章正文内容,下面案例可供参考本小节介绍了一个配置一个USBwifi驱动的整个流程,并没有介绍到SDIO,下小节基于AP6256介绍如何使用。

qq_24093081的博客 2049

第八届传智杯WPS智能办公能力挑战赛练习题库

本文是关于WPS Office软件操作知识的选择题汇总,内容涵盖WPS文字、表格和演示三大组件的常用功能。主要包括:云文档协同编辑、文本框插入、幻灯片打印设置、数据排序与筛选、函数应用(如SUMIF、COUNT)、动画效果设置、格式刷使用、页眉页脚设置、单元格引用类型等基础操作要点。同时涉及计算机基础概念如二进制、ROM存储器等。题目以单选和多选形式呈现,附带详细答案解析,全面检验用户对WPS办公软件的功能掌握程度和实际操作能力,适用于办公软件技能培训和水平测试。

qq_73044452的博客 1432

Unity调用Android原生安装APK:BH资源文件封装与混合开发实践

在移动应用开发中,混合开发技术通过整合不同平台的优势,实现功能扩展与性能优化。其核心原理在于利用平台间的通信机制,如Unity通过JNI调用Android原生代码,完成系统级功能。这种技术价值在于提升应用内聚性,简化用户操作流程,增强模块化能力。在应用场景上,常见于游戏内嵌社区安装、模块化应用动态更新等需求。本文聚焦于Unity与Android混合开发中的APK自主安装问题,通过封装BH资源文件,将Android原生安装逻辑与APK文件打包为Unity可调用的资源包,实现一键安装。其中涉及Android插件

weixin_30530939的博客 458

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android应用启动,卸载,分享应用

android应用启动,卸载,跳转到应用信息页面代码 1.卸载应用 /** * 卸载应用程序 */ private void uninstallApplication() { Intent intent = new Intent(); // // // // intent.setAction("andro

liu_qin_bin的博客 447

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android 应用内启动第三方应用

在工作中有一个需要启动第三方应用的功能,需求是:判断是否安装该应用,如果安装就启动,没有的安装,则启动默认浏览器,访问一个地址来下载。 1.判断是否已安装了该应用private boolean isInstall(Context context, String packageName ) { final PackageManager packageManager = cont

mamr227的博客 619

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android之应用程序启动第三方应用

在现在Android开发中应用中越来越丰富的操作,可其他应用程序关联与启动,调起第三方应用例如(“QQ”、“微信”、“支付宝”、“高德地图”等),还有一些系统应用(“电话”、“短信”、“拍照”、“图库”等),下面一起来看看如何启动这些常用应用。 一、QQ 1. 第三方应用 1)通过包名启动 PackageManager packageManager = this.getPackageMa...

lizhong 1305

PICO企业级开发者API

记录方便使用

快乐教主的博客 3630

安卓语音交互开发实战:从无障碍服务到语音指令自动化

语音交互作为人机交互的重要分支,其核心在于将自然语言指令转化为设备可执行的操作。其技术原理主要涉及语音识别(ASR)将音频转为文本,以及自然语言理解(NLU)解析用户意图。在安卓平台上,实现此类功能的技术价值在于能极大提升操作效率,尤其在驾驶、多任务处理等双手受限场景。典型的应用场景包括全局语音搜索、应用快捷启动、跨应用自动化操作等。本文以构建一个类似“Sesame Preview语音模式”的功能模块为例,深入探讨如何结合安卓无障碍服务(AccessibilityService)与语音识别技术,实现从“听到

weixin_34008805的博客 544

如何跳转到其他APP(android)

有很多小伙伴会遇上这样的需求,从自己的app页面跳转到其他APP界面,一般情况下都是在自己的主包中跳转到公司其他APP,或者是合作方的APP,如果手机中没有这款APP会下载这款APP 。 今天,博主就教你们如何跳转到其他app。不多说,直接上代码。 public class TiaoZhuan extends AppCompatActivity implements View.OnClickLis...

weixin_34129145的博客 714

android 程序 位置,android – 从我的应用程序在特定位置打开...

我正试图通过Android应用在全景模式下打开Goog??le StreetView.我真的想打开谷歌街景而不是谷歌地图,因为我想使用虚拟现实应用程序使用VR玻璃,它使用立体视图和全景模式.我想要的全景模式是这样的:https://youtu.be/3mQKGEnWxIw以下代码打开StreetView应用:PackageManager pm = this.getPackageManager();...

weixin_33778479的博客 178

app打开另一个app

try{ PackageManagerpackageManager=getPackageManager(); Intentintent=newIntent(); intent=packageManager.getLaunchIntentForPackage("com.tencent.mm"); startActivit...

weixin_30906425的博客 98

如何在自己的应用中打开支付宝客户端

在做Android程序的过程中,我们经常需要在自己的项目中打开其他软件,通用的方法如下: 1.在程序你中通过代码来查看手机上已安装的软件的包名; 2.通过该应该的包名来打开该软件。 获取已安装软件的包名的代码如下: PackageManager packageManager = this.getApplicationContext().getPackageManager(); Li

If rest, rust! 1万+
上一篇: Android中的sqlite3的安装和使用, /system/xbin/sqlite3[1]: syntax error: ‘(‘ unexpected问题解决,以及资sqlite3源下载
下一篇: Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值