当前位置:首页 » 安卓系统 » android隐式调用

android隐式调用

发布时间: 2025-06-01 16:54:10

⑴ Android APP调起另外一个APP并传值

第一种:

第二种:

setClassName内部也是调用的setComponent。

调用方:

被调用方在AndroidManifest的Activity中添加自定义action:

被调用方数据接收:

第一种:

调用方通过点击H5网页上按钮

这种方法存在着弊端就是没办法判断手机上是否安装APP时,更适合打开自己APP中Activity。一般建议js与java进行交互调用原生的方法: WebViewJavascriptBridge 使用简单方便,并且避免了一些js脚本注入漏洞。
第二种:隐式调用

被调用方在AndroidManifest的Activity中添加自定义action:

被调用Activity中数据接收:

注意: 这两种方式只适合针对某个页面,都只是在自己应用中跳转第三方应用,并不是真正的唤醒,比如应用A已经在后台存在了,应用B调用以上两种方式后,只是在应用B中重新打开了一个应用A,此时的应用A是相当与存在两个,一个是在后台单独存在,一个是依存应用B存在,是添加到应用B的栈中的,当点击A页面里面的跳转按钮时才真正调起跳转到A应用。

⑵ android 显示intent和隐士inent的区别

以下内容为CSDN上(网名:yuan1590)对安卓显示意图和隐身意图的总结(ps前人种树,树,后人乘凉,所以我就粘过来了,希望帮到您):
1. Intent
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,
Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。
使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。

2. 显式意图、隐式意图
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
如: 在 MainActicity 中打开一个新的 Acticity -- OtherActivity
1. Intent intent = new Intent();
2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
3. 第二行代码可以更换为:intent.setClass(MainActivity.this, OtherActivity.class);
4. 也可以使用构造器来指定组件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)
三种 “显式意图” 指定方式等价
隐式意图:没有明确指定组件名的Intent为隐式意图。
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图
例如拨打电话的意图:
Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

动作测试(Action test)
一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
+ 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
<intent-filter><!-- 空的 --></intent-filter>
+ 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试(Category test)
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。
但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。
原因就是,他内部要求去匹配 android.intent.category.DEFAULT 这个类别。

因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。
(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

数据测试(Data test)
当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。
例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;
如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;
如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。
当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。
数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:
a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。
b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。
这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。
c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。
d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。
如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。
换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。

⑶ 如何使用ContentProvider类实现隐式Intent

举例说明:
1、定义对应的ContentProvider类TestProvider,继承ContentProvider。
类里面需要实现一系列的abstract方法,如:OnCreate,getType,insert…

2、在应用程序的AndroidManifest.xml中加入<provider>标签,例如:
<provider android:name="TestProvider"
android:authorities="com.android.test.settings"/>

android:name是指对应ContentProvider的类名,也就是所建的TestProvider类
android:authorities是标识部分,为了保证唯一性,这里使用完整的包名和类名

3、在想要调用的activity所对应应用的AndroidManifest.xml中,把该activity的intent-filter添加上对Data的要求

4、在StartActivity(intent)之前,设定该intent对应的action(调用setAction()指定)和data(调用setData(Uri.parse(content:// com.android.test.settings /test)))。StartActivity之后,Android系统内部就会根据上面Uri里面的com.android.test.settings,去找到对应的TestProvider(根据android:authorities),然后再调用getType方法。这样Android系统会根据getType返回的数据类型,以及intent在setAction时制定的action,去启动对应的Activity

⑷ Android 跨应用间调用: URL Scheme

Android中的自定义的 URL Scheme 是一种页面内跳转协议,也可以被称为 URLRouter ,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。这样隐式intent的方法跳转好处如下:

上文已经说过, URL Scheme 是就通过类似打开网页的方式去通过路由打开一个Activity,其协议格式和我们打开网页输入的网址类似。

一个完整的完整的URL Scheme协议格式由scheme、host、port、path和query组成,其结构如下所示:

其中scheme既可以是Android中常见的协议,也可以是我们自定义的协议。Android中常见的协议包括content协议、http协议、file协议等,自定义协议可以使用自定义的字符串,当我们启动第三方的应用时候,多是使用自定义协议。

如下是一个自定义协议的URI:

通过上面的路径 Scheme、Host、port、path、query全部包含:

URL Scheme 的使用方法简要言之就是先在manifest中配置能接受Scheme方式启动的activity;当需要调用时,将Scheme协议的URi以Data的形式加入到Intent中,隐式调用该activity。

1). 在AndroidManifest.xml中对<activity >标签增加<intent-filter>设置Scheme

上面的设置中可以看到,MainActivity包含多个<intent-filter>设置,第一个是正常的启动,也就是在应用列表中启动;第二个是通过 URL Scheme 方式启动,其本身也是隐式Intent调用的一种,不同在于添加了<data>属性,定义了其接受 URL Scheme 协议格式为 urlschemel://auth_activity

这里需要说明下, URL Scheme 协议格式中,组成URI的这些属性在<data >标签中都是可选的 ,但存在如下的依赖关系:

当我们将intent对象中的Uri参数与intent-filter中的<data>标签指定的URI格式进行对比时,我们只对比intent-filter的<data>标签指定的部分,例如:

需要注意的是,intent-filter的<data>标签在指定path的值时,可以在里面使用通配符*,起到部分匹配的效果。

2). 使用URL启动Activity

当然可以在网页中调用

或者是在JS中调用

3.)如何判断URL Scheme是否有效

有时候需要把一些辅助性的、较为独立的APP在Home Launcher中隐藏起来,只允许一些特定的APP调用。这个时候,我们可以利用 URL Scheme 协议来做到这一点,设置AndroidManifest.xml中对<activity >标签如下

因为Home Launcher列出的应用图标要求必须有Activity同时满足

上面的配置中有多余的category和data限制存在,所以并不匹配,不会在Home Launcher出现,但是可以使用 URL Scheme 来启动。

这样就可以将一组APP设置一个统一的入口,然后根据实际需要在调用不同子APP,即所谓的 APP业务组件化 , URL Scheme 在其中有着重要的作用,更进一步讨论会在以后的文章中呈现,敬请期待。

参考文献:
http://blog.csdn.net/iispring/article/details/48481793
http://blog.csdn.net/hb707934728/article/details/53196419
http://www.cnblogs.com/whoislcj/p/5825333.html

⑸ android 为什么采用intent 进行数据交互

Android系统的一个重要特性就是一个应用程序可以调用另外一个应用程序来完成用户的请求动作。比如你的应用程序需要给用户显示一个地理位置在地图上,你不必在你的应用程序中实现地图功能,而是创建一个显示这个地理位置的Intent,发送出去,Android系统会启动那些可以处理这个请求的应用程序。还比如:你用网络云盘下载了一个pdf文档,你在点击打开这个文档的时候网络云盘是无法打开的,但是也许你系统上安装有其他的能打开pdf文档的阅读器,这个时候就会弹出一个对话框,列举了可以打开pdf文档的应用程序,你可以自由选择一个应用程序打开你下载的文档。

使用隐式Intent:

隐式Intent不会指明要启动的组件名称,而是声明执行的动作,动作指定了你想要做什么事情,比如显示(view),编辑(edit),发送(send),获取一些东西(get something)等。Intent经常会附带一些数据,比如你要查看的地址,发送邮件的内容等。数据形式依赖于你想要做什么事情,数据可以是一个Uri,也可以是其他数据类型(基本数据类型或者对象)之一。数据不是必须的,你的Intent中可以不包含data。

⑹ 如何在Android中调用浏览器打开网页

在安卓代码中我们有时需要调用浏览器来打开相应的网页,此时可以有以下几种实现方式:
一:
调用默认浏览器

Intent intent = new Intent(); //Intent
intent = new Intent(Intent.ACTION_VIEW,uri);
intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("此处填链接"); intent.setData(content_url); startActivity(intent);

其他浏览器

Intent intent = new Intent(); //Intent
intent = new Intent(Intent.ACTION_VIEW,uri); intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse("此处填链接"); intent.setData(content_url); intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent);
uc浏览器":"com.uc.browser", "com.uc.browser.ActivityUpdate“opera:"com.opera.mini.android", "com.opera.mini.android.Browser"qq浏览器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"
二:

1、自定义一个简单的WebView浏览器,设置下面属性:

mWebView = (ProgressWebView) findViewById(R.id.baseweb_webview); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new WebViewClient());

2、指定需要打开的额网页,在自定义的WebViewActivity中打开,如:

WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.hao123.com");

3、还可以查看相关的自定义WebView简单浏览器的Demo,《WebView控件实现的简单浏览器效果》,以及对应的TeachCourse介绍怎么使用

热点内容
android广告页 发布:2025-06-03 04:00:45 浏览:248
linux驱动实战 发布:2025-06-03 03:57:56 浏览:142
蓝叠服务器地址 发布:2025-06-03 03:57:22 浏览:626
工控c语言 发布:2025-06-03 03:53:05 浏览:65
个税到算法 发布:2025-06-03 03:13:12 浏览:460
新东方缓存视频导出 发布:2025-06-03 03:08:20 浏览:570
内存卡加密码 发布:2025-06-03 02:38:48 浏览:459
laravel执行的sql 发布:2025-06-03 02:37:07 浏览:632
门店软件配置有哪些 发布:2025-06-03 02:37:06 浏览:749
shell判断是否文件夹 发布:2025-06-03 02:20:19 浏览:983