【Android】打开第三方App以及系统应用服务

Android 8.1 系统应用如何拉起第三方应用的服务 阅读详情

原文地址:    http://blog.youkuaiyun.com/lchad/article/details/42198187




在我们日常使用Android App的时候,会经常有这样的一种情形:在一个App中触发了某种条件会打开另一个App。例如在手机QQ中给好友发送文件,就会打开文件管理器,给好友发送照片就会打开相册或者相机,然后让你选择照片抑或拍一张照片,还有就是比较令人讨厌的,点击某个图标自动跳转到应用市场,亲~安装我们的应用吧!!!这样的情形还有很多,不胜枚举,所以作为Android开发者的我们,应该知道它的实现原理。这篇文章算是一个备忘吧,总结一下我们作为开发者接触的比较多的情形。好了,废话不多说,我们直接上代码。


1.打开第三方应用,由于博主比较喜欢泡知乎,所以接下来的例子就用知乎手机客户端作为例子吧。照例,打开我们的Android Studio,新建一个叫做TestDemo的Project,然后一直next下去即可。我们的业务逻辑大概是点击一个Button,监听器坚挺Button,如果被点击了,那么打开第三方App。


布局界面代码(其实很简单辣,就是一个按钮):

[html]  view plain  copy
  1. <RelativeLayout  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.   
  12.     <Button  
  13.         android:layout_marginTop="55dp"  
  14.         android:textSize="25sp"  
  15.         android:id="@+id/button"  
  16.         android:text="install another App"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content" />  
  19.   
  20. </RelativeLayout>  


界面效果(机器为Nexus 6):

Main_Activity.java代码:

[java]  view plain  copy
  1. package com.example.chad.testdemo;  
  2.   
  3. import android.app.SearchManager;  
  4. import android.content.ActivityNotFoundException;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.pm.PackageManager;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.support.v7.app.ActionBarActivity;  
  11. import android.view.Menu;  
  12. import android.view.MenuItem;  
  13. import android.view.View;  
  14. import android.widget.Button;  
  15.   
  16.   
  17. public class MainActivity extends ActionBarActivity {  
  18.     private Button mButton;  
  19.      
  20.     public static final String ANOTHER_PACKAGE_NAME = "com.zhihu.android";  
  21.     /* 
  22.     **启动第三方App 
  23.      */  
  24.     public static void launchAnotherApp(Context context){  
  25.         if(isAppInstalled(context, ANOTHER_PACKAGE_NAME)){  
  26.             context.startActivity(context.getPackageManager().getLaunchIntentForPackage(ANOTHER_PACKAGE_NAME));  
  27.         } else{  
  28.             goToMarket(context, ANOTHER_PACKAGE_NAME);  
  29.         }  
  30.     }  
  31.     /* 
  32.     **检测第三方App是否已安装 
  33.      */  
  34.     public static boolean isAppInstalled(Context context, String packageName){  
  35.         try {  
  36.             context.getPackageManager().getPackageInfo(packageName, 0);  
  37.             return true;  
  38.         } catch (PackageManager.NameNotFoundException e) {  
  39.             e.printStackTrace();  
  40.             return false;  
  41.         }  
  42.   
  43.     }  
  44.     /* 
  45.     **去应用市场下载页面 
  46.      */  
  47.     public static void goToMarket(Context context, String packageName){  
  48.         Uri uri = Uri.parse("market://details?id=" + packageName);  
  49.         Intent goToMarket = new Intent(Intent.ACTION_VIEW,uri);  
  50.         try {  
  51.             context.startActivity(goToMarket);  
  52.         } catch (ActivityNotFoundException e){  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  
  56.   
  57.      
  58.     @Override  
  59.     protected void onCreate(Bundle savedInstanceState) {  
  60.         super.onCreate(savedInstanceState);  
  61.         setContentView(R.layout.activity_main);  
  62.         mButton = (Button)findViewById(R.id.button);  
  63.         mButton.setOnClickListener(new View.OnClickListener() {  
  64.             @Override  
  65.             public void onClick(View v) {  
  66.                 launchAnotherApp(MainActivity.this);  
  67.   
  68.             }  
  69.         });  
  70.     }  
  71.   
  72.   
  73.     @Override  
  74.     public boolean onCreateOptionsMenu(Menu menu) {  
  75.         // Inflate the menu; this adds items to the action bar if it is present.  
  76.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  77.         return true;  
  78.     }  
  79.   
  80.     @Override  
  81.     public boolean onOptionsItemSelected(MenuItem item) {  
  82.         // Handle action bar item clicks here. The action bar will  
  83.         // automatically handle clicks on the Home/Up button, so long  
  84.         // as you specify a parent activity in AndroidManifest.xml.  
  85.         int id = item.getItemId();  
  86.   
  87.         //noinspection SimplifiableIfStatement  
  88.         if (id == R.id.action_settings) {  
  89.             return true;  
  90.         }  
  91.   
  92.         return super.onOptionsItemSelected(item);  
  93.     }  
  94. }  

好了,现在解释一下这段代码。

我们能否成功的掉取出指定的第三方应用的核心就是,一个正确的包名。这里解释一下什么叫包名,我们看一下MainActivity.java的第一行:

[java]  view plain  copy
  1. package com.example.chad.testdemo;  
相信学过java的朋友对包一定不会陌生。就是为了唯一标识每个类并分组,所以java使用了package的概念。一般而言,包的名字都是公司网址的倒序,如com.google.*,如果对包的概念仍有疑问的同学,你可以自己找一本书翻翻,理解起来并不难。而在我们的Android开发中Package的作用是差不多的,你可以把包理解为我们每一个App的”身份证号“,它唯一标识了我们的App跟其他的App是不同的,这样才能在应用市场浩如烟海的App中确定你是唯一的,所以劝各位一定要给自己的App取一个独特的包名,要不然就会很尴尬,比如豌豆荚有一个洗白白的功能,不知道大家知不知道,如果你和别人的App包名相同,那么你的App就用可能被洗掉,被认为是一个脏应用。

实现这个功能我们定义了三个函数launchAnotherApp是功能的主体,isAppInstalled方法和goToMarket方法是被它调用来辅助它的。isAppInstalled的作用是判断这个应用是否已经被安装了,如果安装了那么好直接打开即可,如果是没有安装,那么就调用goToMarket方法进入应用市场界面,引导你下载这个App,思路还是很清晰的。


2.跳转到指定的网页

[java]  view plain  copy
  1. //浏览网页  
  2.     public static void browesTheWeb(Context context, String theURL){     //theURL就是你指定的要打开的网页  
  3.         Uri uri = Uri.parse(theURL);  
  4.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  5.         context.startActivity(i);  
  6.     }  
我们可以再监听器的onClick方法中调用这个静态方法,如下:

[java]  view plain  copy
  1. mButton.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {    
  4.         //open the url www.baidu.com  
  5.         //browesTheWeb(MainActivity.this, "http://www.baidu.com");  
  6.   
  7.     }  
  8. });  


3.调用系统的搜索功能

[java]  view plain  copy
  1. // search   
  2.     public static void searchByGoogle(Context context, String contentToSearch){   
  3.         Intent i = new Intent();  
  4.         i.setAction(Intent.ACTION_SEARCH);  
  5.         i.putExtra(SearchManager.QUERY, contentToSearch);  
  6.         context.startActivity(i);  
  7.     }  
我们仍然是在监听器的onClick方法中调用这个静态方法。

4.调用谷歌地图或百度地图显示位置:

[java]  view plain  copy
  1. public static void showTheMap(Context context, String mapToShow){  
  2.         Uri uri = Uri.parse(mapToShow);  
  3.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  4.         context.startActivity(i);  
  5.     }  
函数调用方法(监听器部分的代码我就省略了哈):

[java]  view plain  copy
  1. showTheMap(MainActivity.this, "geo:113.461528,22.275482");  

5.打电话

[java]  view plain  copy
  1. public static void callSomePhone(Context context, String PhoneNumber){  
  2.         Uri uri = Uri.parse(PhoneNumber);  
  3.         Intent i = new Intent(Intent.ACTION_VIEW, uri);  
  4.         context.startActivity(i);  
  5.     }  
函数调用方法:

[java]  view plain  copy
  1. callSomePhone(MainActivity.this, "tel:15958003646");  

6.发短信

[java]  view plain  copy
  1. public static void sendAMessage(Context context, String PhoneNumber){  
  2.         Uri uri = Uri.parse(PhoneNumber);  
  3.         Intent i = new Intent(Intent.ACTION_SENDTO, uri);  
  4.         i.putExtra("sms_bodu", "the sms text");  
  5.         context.startActivity(i);  
  6.         // or the code following  
  7.         /*Intent it = new Intent(Intent.ACTION_VIEW); 
  8.         it.putExtra("sms_body", "TheSMS text"); 
  9.         it.setType("vnd.android-dir/mms-sms"); 
  10.         context.startActivity(it);*/  
  11.           
  12.     }  
函数调用方法:

[java]  view plain  copy
  1. sendAMessage(MainActivity.this, "smsto:12345678");  

安卓逆向调试:基于Magisk修改ro.debuggable属性的两种实战方法 在安卓系统开发与安全研究中,系统属性是控制设备行为的关键配置项。其中,ro.debuggable属性作为系统调试模式的总开关,其原理在于控制底层内核与运行时环境对调试接口的暴露程度。开启此属性具有重要的技术价值,它允许安全研究人员和开发者进行进程注入、动态分析和内存取证等高级操作,是应用行为分析、漏洞挖掘和系统机制研究的基石。在实际应用场景中,这常见于移动应用安全评估、恶意软件分析和系统级功能开发。本文聚焦于在已获取root权限的设备上,通过Magisk框架实现属性修改,具体介绍了利用resetprop命令 阅读详情

相关推荐

安卓入门一 Java基础

一、团队效率提升 版本更新 Android增量更新与热修复 增量更新的目的是为了减少更新app所需要下载的包体积大小,常见如手机端游戏,apk包体积为几百M,但有时更新只需下载十几M的安装包即可完成更新。 增量更新demo地址:https://github.com/po1arbear/bsdiff-android 热修复一般是用于当已经发布的app有Bug需要修复的时候,开发者修改代码并发布补丁,让应用能够在不需要重新安装的情况下实现更新,主流方案有Tinker、AndFix等。 管理软件更新

weixin_52735932的博客 2841

Android 打开其他应用的方式

很多时候,我们会想打开第三方应用,比如广告中判断应用是否安装,如果安装就跳转该应用首页,未安装则去应用商店该应用详情页。那么接下来就讲讲几种打开第三方应用首页的方案。

简单技术记录总结栈 7926

CMOS 半加器和全加器&&数字集成电路&& Cadence Virtuoso

数字集成电路——半加器和全加器

计科小学生的博客 1万+

Android开发,打开第三方应用(含系统应用)

Android开发,打开第三方应用(含系统应用)

qq_34629725的博客 1273

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 710

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3067

android 从应用中打开第三方应用

使用判断第三方应是否存在时在Android高版本系统会一直获取不到。后来研究发现需要在AndroidManifest.xml中新增以下权限以及queries。

xia09222826的专栏 959

【PostgreSQL教程】PostgreSQL 高级篇之子查询

子查询也可称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、、>=、

No8g攻城狮的博客 1206

基于Android10的Service的启动流程

一直与Service打交道,确从来没有真正了解过Service的启动流程是怎样的,onCreate,onStartCommand等是在哪里被调用的,所以今天打算通过Android Q的代码来重新认识它。 首先添加一张不怎么标准的时序图,仅供参考 Android的Activity,Service,Broadcast,Provider都有一个共同的父类Context,比如我们在activity...

持之以恒 2094

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1512

后仿真中《SDF反标必懂连载篇》之 Negative Delay (理论篇)

今天,学习一下SDF文件中的负数延时问题。比如下面的图片中的SETUPHOLD 中的hold time 为负数。

那么菜的博客 2573

最新安卓版本对照表,API对照表(持续更新,更新到安卓17)

话不多说,直接上表,持续更新(更新到安卓16)。 列出了所有记录的可能会影响应用开发者的功能和行为变更。请使用此列表查找影响您的变更,然后点击相应的链接以阅读文档。下表列出了所有记录的可能会影响应用开发者的功能和行为变更。请使用此列表查找影响您的变更,然后点击相应的链接以阅读文档。Java 和 OpenJDK 是 Oracle 及/或其关联公司的商标或注册商标。

雨季余静的博客 9万+

玩转Docker小游戏项目系列: Docker部署中国象棋网页小游戏

玩转Docker小游戏项目系列: Docker部署中国象棋网页小游戏

jks212454的博客 440

安卓开启位置服务器,安卓系统打开gps定位服务器地址

安卓系统打开gps定位服务器地址 内容精选换一换安卓模拟器(Android Virtual Device),简称AVD,可以模拟安卓设备并将其运行在服务器上。利用AVD,您可以对安卓应用进行原型设计、开发和测试,而无需使用真实的手机。AVD具备运行安卓应用、adb连接、上网、屏幕、GPS定位、电池、及VNC远程连接等基本功能。本文档针对CentOS 7.6系统,指导搭建基于Taisha将NFS文件...

weixin_42357916的博客 817

提示词工程在机器翻译质量提升中的应用

Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords

AI天才研究院 1151

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

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

WPS二次开发系列:WPS SDK打开在线文档

在项目开发中会碰到需要在自己的应用中(OA系统)调用WPS打开Word,Excel,Ppt等Office系列文档(文档是在线的,只有文档链接)的情况,此文介绍了WPS-SDK调用相关API文档完美实现的从第三方用于调用API打开WPS在线文档进行文档编辑保存后并将文档保存结果回传给第三方应用服务器的功能。至此一个第三方应用调用WPS打开在线文档,进行文档编辑并监听保存完成后的文档回传给第三方应用的功能完成,是不是超级简单。将WPS提供集成资源压缩包里面libs相关的aar文件集成到自己的工程中。

weixin_51832365的博客 3560

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一文让你知道关于App推送那些事

推送介绍

qq_36162336的博客 5248

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

springboot+vue3安卓Android个人健康体检预约系统APP的设计与实现

"的Toast消息。作为主要的数据存储解决方案,使用 MySQL 数据库与后端服务进行集成,通过 Spring Boot 的数据访问技术来简化与 MySQL 数据库的交互,确保数据的安全性和一致性。(5)写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。维护:android系统的更新总是很快,而且不总是向后兼容的,所以设计一个程序并不难,如何让它适应不同版本的os是有难度的。

qq840612233的博客 380

物联网应用中android操作系统的作用,浅谈物联网操作系统选择,浏览器比安卓更合适!...

描述做物联网开发选好操作系统,对项目的成败至关重要。无论是工业物联网,智能工控,还是家用物联网,智能冰箱、智能洗衣机、智能微波炉、智能垃圾桶等,操作系统的重要性都不言而喻。系统如果选的好,就会事半功倍;而如果没选择好,事倍功半不说,一个好项目半路夭折的概率也会大大增加!安卓系统由于其在智能手机领域已经"声名大噪",不少人开发物联网设备时,也把目光聚焦到了安卓身上。与此同时,浏览器也冲入了物联网领域...

weixin_33277412的博客 1484

2021-09-24 Android:adb shell service和 dumpsys 获取服务

一、adb shell service list列出系统所有的服务,但是这里不包含第三方应用的服务。 二、使用dumpsys 列出系统和应用的所有service 三、查看第三方app打开的service。 四、查看Android 原生屏幕截屏service ...

海月汐辰 6065

ssm基于Android平台的美容美发服务系统

首先双击打开APP,连上网络之后会显示出本系统的登录界面,这是进入APP的第初始页面“登录”,能成功进入到该登录界面则代表APP的开启是成功的,接下来就可以操作本系统所带有的其他所有的功能。如果是第一次使用本APP的使用者,首先是要进行注册,点击“注册”,然后就会进入到注册的页面里面,将用户信息录入注册表,确认信息正确后,系统才会进入登录界面,用户登录成功后可使用本APP所提供的所有功能。[3]郭阳, 常英贤. 浅谈Java语言在计算机软件开发中的应用[J]. 数字通信世界, 2022(1):4.

wqq_992250277的博客 1004

计算机毕设 java 基于 Android 的 “自律打卡” APP SpringBoot 安卓智能自律打卡管理 APP JavaAndroid 学生任务打卡与互动平台

在快节奏的学习与生活中,缺乏自律规划、目标难以坚持成为许多人的痛点,传统人工打卡模式存在记录繁琐、缺乏监督、互动性弱等问题,无法有效帮助用户培养良好习惯。尤其是学生群体,亟需一款便捷、高效的打卡工具来规范学习与生活节奏,同时辅助管理者实现对任务打卡的集中管理。基于此,开发一款基于 Android 的 “自律打卡” APP 具有重要的现实意义,既能满足用户个性化打卡需求,又能提升管理效率。

毕设源码余学姐 384

计算机毕业设计springboot基于Android的“自律打卡”APP SpringBoot+Android 下的“习惯追踪”移动应用 基于 SpringBoot 与 Android

在“全民内卷”与“自律经济”并行的当下,手机已成为最大的时间杀手,也是最好的自我救赎工具。把打卡从纸质便签、微信群接龙搬到指尖,让每一次签到都能被记录、被统计、被激励,成为大学生与职场新人最触手可及的“成长仪式感”。本系统正是围绕这一需求,用 SpringBoot 搭建轻量级后端,用 Android+uni-app 渲染原生级体验,打造一款零广告、低延迟、可离线、可扩展的自律打卡利器。 整套产品分学生端 App 与后台管理两大部分,功能模块全部开箱即用,无需二次开发即可闭环运行: 用户注册/登录/找回密码

毕业设计-小慧师姐 939

安卓怎样查看网站服务器地址,安卓查看应用的服务器地址

安卓查看应用的服务器地址 内容精选换一换应用创建成功后,您可以在“应用管理”页面查看详情,包括但不限于:应用的基本信息连接过该应用的设备信息部署了该应用的云服务器信息应用相关的监控指标,如用户使用应用的体验数据登录控制台,在服务列表中选择“计算 > VR云渲游平台”。在左侧导航栏,选择“应用管理”,打开应用管理页面。在应用列表中,根据名称查看对应的应用信息。包括:应用的基本信息华为云帮助中心...

weixin_34007963的博客 1735

基于SpringBoot HII健身房app

本课题研究的是基于Android系统平台下的HIIT健身房app,开发这款HIIT健身房app主要是为了帮助用户可以随时随地查询健身房的信息情况。本文详细讲述了HIIT健身房app的界面设计及使用,主要包括界面的实现、控件的使用、界面的布局和异常的处理等内容,将准确的健身房情况呈现给用户。

353

安卓怎样查看网站服务器地址,怎样查看安卓APP服务器地址

怎样查看安卓APP服务器地址 内容精选换一换用户可以为虚拟IP地址绑定一个弹性公网IP地址,从互联网可以访问后端绑定了同一个虚拟IP地址的多个主备部署的弹性云服务器,增强容灾性能。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口,虚拟IP的相关操作入口也随之迁移。目前存在以下两种入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。已解耦:在进入“网络当连接目的端服务...

weixin_35677363的博客 2879
上一篇: 快速定位到该按钮的代码
下一篇: android 广播详解
xy%
xy%
博客等级 码龄11年 10粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值