转于:http://iteches.com/archives/18829
---------------------------------------------------------
Android – 使用特定的URL开启应用程序
在iPhone、Android或Windows Phone 7的环境都支持透过URL中特定的Schema来启动特定的应用程序,
例如:「zune:\\」、「contnet:\\」…等,该目的告诉系统有一特定的连结要被启动,请系统动找到注册
对应该Schema的程序并且启动它,如果想要夹参数带入应用程序中,写法就如同透过QueryString的方式
将Key/Value带入URL中,由程序启动时根据特定的参数取得值来完成任务。
要完成这样的功能,在开发Android时要修改那些部分与概念,往下来概要的说明:
〉AndroidManifest.xml File:
该份档案描述整个Android应用程序的所有功能、使用的Library、要求手机设备提供的权限控制与存取范围,
因此,今天要增加对特定URL的处理,也正是从该档案下手告诉Android系统该应用程序将对某特定的URL Schema
有所反应,当系统接收到该URL时自动启动应用程序。
A. Intent:
Android应用程序里三个重要组件:activities、services与boardcast services,它们之间传递讯息的对象即是:Intent。
Intent可被不同的应用程序建立当作互相沟通的主要接口,它本身是个对象用于保存讯息交换的内容、Anrdoid固定参等,
在三种不同组件使用方式也有所不同,如下:
‧Activity:
透过Context.startActivity()将Intent带到指定的Activity之中;并且实作Activity.startActivityForResult()接受由另一个
Activity回传的Intent内容(至于回传的内容会透过setResult()的方式将Intent放入);
‧Service:
透过Context.startService()去初始化Service并且将Intent传递给Service让它进行处理;另外可透过Context.bindService()
去选择特定的Service与Intent互相连接;
‧Boardcast Service:
例如透过Context.sendBoardcast()将Intent发送给任何的Boardcast,或是透过Context.sendStickyBroadcast()来送给有兴
趣的Boardcast service。由于Intent里需指定特定的system code不然该Intent就没有被特定的boardcast service查觉到。
了解Intent怎么在三种组件中使用后,接下来针对Intent对象的结构进行说明:
A-1. Component Name:
该属性为ComponentName对象,它代表Intent目标的完整名称,例如:com.example.project.app.FreneticActivity;
例如:由Main的activity移到Second的activity,然而在Second收到Intent它的ComponentName即为完整的Second命
名空间,而Package即与AndroidManifest.xml的相同,但移动到不同的命名空间即不同。如下图:
可透过setComponent()、)" target=_blank>setClass()、setClassName()与getComponent()来操作ComponentName的数据。
A-2. Action:(重要)
Action是Intent中重点部分,它定义该Intent要负责的任务是什么,例如:我想要拨打电话,即会指定该Intent的Action
为ACTION_CALL并在setData指定Uri为tel:0932xxxxxx,启动并直接拨打电话。相对的,如果是broadcast receiver一样透
过Action的指定,让Intent告诉Android系统当收到电量过低时,要通知自己注册的broadcast receiver来完成指定的任务。
Constant Target component Action ACTION_CALL activity 启动一个拨打电话。 ACTION_EDIT activity 显示数据提供用户有编辑能力。 ACTION_MAIN activity 预设第一个启动的activity,没有数据输入和回传数据输出。 ACTION_SYNC activity 设备与伺服务同步数据。 ACTION_VIEW activity 显示数据不支持编辑能力。 ACTION_DIAL activity 启动拨号程序并填入拨号的号码。 ACTION_BATTERY_LOW broadcast receiver 当电量过低时发出的警告。 ACTION_HEADSET_PLUG broadcast receiver 设备已经插入了耳机,或将它拔掉。 ACTION_SCREEN_ON broadcast receiver 屏幕被打开。 ACTION_TIMEZONE_CHANGED broadcast receiver 时区设置发生了变化。
另外,Action也决定的Intent的数据结构,特别是:data与extras。然而,Action除了上述Android API定义的之外,
(随着Android版本不同有更多的Action可用),其实也可以自定义。
A-3. Category:
用于描述该组件(activity, service, broadcast service)要处理的Intent类型,然而,该Category可任意数量的去描述该组件
要处理的Intent对象。如下列的描述类型:
Constant Meaning CATEGORY_BROWSABLE 目标activity可以安全地被透过Browser中显示的link(或uri)来启动,例如:透过image或mail来启动对应的应用程序。 CATEGORY_GADGET activity可以被嵌入至另一个hosts gadgets中的activity。 CATEGORY_HOME activity呈现于HOME screen,也就是当用户按下实体键盘中的HOME时,用户第一个看到的画面。例如:GO桌面即是这种类型的组件。 CATEGORY_LAUNCHER activity是task的初始activity,并且是application launcher的top-level。该类型常设定应用程序第一个启动的activity,并且配合ACTION_MAIN一同定义该activity。 CATEGORY_PREFFRENCE 目标activity是一个preference panel。
A-4. Data:
利用URI为概念的传递格式,定义了URI与MIME的数据类型。不同的Action搭配不同类型Data格式。例如:ACTION_EDIT,
Datal部分需要包括要编辑的文件的URI;ACTION_CALL则Data为要拨打电话的URI:tel:0932xxxxx;如果是ACTION_VIEW,
则Data为http:URI指定的activity收到后将下载或开启对应的程序将数据显示出来。
另外,在找到Intent的对应后,除了取出URI之外,更要看它定义的MIME为何种类型,例如:video/mpeg,则代表要开启
的数据类型为mpeg的影片资料。
通常透过URI也可以推断出相关的应用,例如:Content://即是Android的Content Provider机制,应用程序之间如果有实作
支持Content Provider那么别的应用程序即可以透过Content://来撷取它开放出来的资源。
透过setData()来定义URI,使用setType()定义 MIME类型或是setDataAndType()同时定义二者。
A-5. Extras:
它是一个Key/Value的数据格式,当作Intent要夹带参数的用途。某些Action透过特定的Extras来传递给目标的activity,
做为初始化或识别的任务,例如:ACTION_TIMEZONE_CHANGED有指定的extra key:time-zone或者是ACTION_HEADSET_PLUG
有指定的extra key:state。这样做的目的在于让Intent不一定只能依靠URI传递参数,所以当二个Activity互动时,也可以
透过该方式来进行数据的传递。
A-6. Flags:
Flags通常用于指示Android系统如何执行activity,例如:activity属于那一个Task来执行;或者如何对待启动的activity等,
也可以把一些特殊定义的标签设定于此,让Intent可以夹带特定的识别代码。
介绍了Intent后,其实可以了解Android在三种组件互动或是透过Browser互动,均是透过Intent概念来进行互动。因此,
最后就介绍如果要让自己的应用程序可以接受URL Schema所影响的Intent要设定的参数有那些,进一步去了解Intent-Filter的特性。
B. Intent-filter:
Intent在Anrdoid开发文件里可分成二个部分:
(1) Explicit intents:Intent指定特定目标对象,通常都是内部Project中的activity或是其他组件互相沟通。 。
(2) Implicit intents:Intent不需要特定目标对象,通常用于激活其他应用程序的组件。
Android在使用Explicit intents时,由于目标比较明确比较没有问题,但在遇到Implicit intents时,系统必须寻找到最匹配的组件
来处理Intent,例如:在AndroidManifest.xml定义Activity、Service或Broadcast Receiver来处理特定的Intent(Intent-Filter)。
透过Intent-Filter定义了组件需要处理的explicit、implicit Intents,但如果组件没有定义Intent-Filter的话,该组件只能处理explicit
intents。
然而,每一个Intent-Filter描述组件(activity, service, broadcast receiver)处理的目标与特性,每一个filter是实例化IntentFilter
类别,filter有三个主要的重点:(1). action;(2). data;(3). category;
‧action:
1: <action android:name="string" />
定义该组件要面对的Action对象为何。name属性通常是使用Intent描述的Action属性,自己的应用程序里如果有自定义要处理的
Action也可以透过自定义的字符串常数来说明。在Intent-Filter中至少要有一个<action>标签。
‧category:
1: <intent-filter>
2: <category android:name="android.intent.category.DEFAULT" />
3: <category android:name="android.intent.category.BROWSABLE" />
4: </intent-filter>
上述提到有关intent中的category描述不太一样,在intent中是直接使用上述提到的常数,但在AndroidManifest.xml中定义的
需要使用完整的字符串来加以描述,例如:android.intent.category.BROWSABLE与intent中使用的CATEGORY_BROWSABLE相似。
‧data:
1: <intent-filter>
2: <data android:mimeType="video/mpeg" android:scheme="http" />
3: <data android:mimeType="audio/mpeg" android:scheme="http" />
4: </intent-filter>
每一个<data>定义了处理的URI与data type(MIME media type),属性包括:schema、host、port与path,其格式如下:
URI:{schema://host:port/path},定义Android如收到相同URI的格式需通当定义这个data的组件;
[注意]
‧透过URL启动的与透过手动启动的应用程序二者是不同的,前者是依赖着启动者的线程所启动,后者则是独立的线程,
二者其实控制的功能都是一样的,最大的差异在于透过URL启动的应用程序,在长按「实体home键」要切换响应用程序时,
它不会出现暂存清单中。
〉范例说明:
1. 实作一个网页里面有一个特定的URL,例如:「myapp://Order?SID=201112301333001」;
1: <html xmlns="http://www.w3.org/1999/xhtml" >
2: <head runat="server">
3: <title>使用特定的URL开启应用程序</title>
4: </head>
5: <body>
6: <form id="form1" runat="server">
7: <div>
8: <!-- 定义特定的URL与Schema -->
9: <a href="myapp://Order?SID=201112301333001">您有一封新单据。</a>
10: </div>
11: </form>
12: </body>
13: </html>
2. 建立透过URL启动后要处理的Activity与撷取参数的功能;
在OnCreate事件中建立取得由URL启动应用程序带入的值,这些数据按照Android的作法会放置于Intent的对象中。
1: @Override
2: protected void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: setContentView(R.layout.urlopen);
5: //取得要显示参数的TextView对象
6: TextView tView = (TextView) findViewById(R.id.textView1);
7:
8: //取得URL所带进来的Intent对象
9: Intent tIntent = this.getIntent();
10: //取得Schema,值为:myapp
11: String tSchema = tIntent.getScheme();
12: //取得URL
13: Uri myURI = tIntent.getData();
14: if (myURI != null) {
15: //取得URL中的Query String参数
16: String tValue = myURI.getQueryParameter("SID");
17: tView.setText(tValue);
18: }
19: }
3. 定义AndroidManifest.xml中支持URL的Schema与互相的相关参数;
1: <application android:icon="@drawable/icon" android:label="@string/app_name">
2: <!-- 主程序-->
3: <activity android:name=".Main"
4: android:label="@string/app_name">
5: <intent-filter>
6: <action android:name="android.intent.action.MAIN" />
7: <category android:name="android.intent.category.LAUNCHER" />
8: </intent-filter>
9: </activity>
10: <!-- 接收由URL启动应用程序后第一个要进入的Activity -->
11: <activity android:name=".Second">
12: <intent-filter>
13: <!-- 宣告该Activity的Action主要类型 -->
14: <action android:name="android.intent.action.VIEW"/>
15: <!-- 定义该Activity支持浏览模式 -->
16: <category android:name="android.intent.category.BROWSABLE"/>
17: <category android:name="android.intent.category.DEFAULT"/>
18: <!-- 定义要处理的URL Schema -->
19: <data android:scheme="myapp"/>
20: </intent-filter>
21: </activity>
22: </application>
======
以上是介绍如何透过特定的URL来启动自己的应用程序,由于该用途很适合结合目前公司既有程序,
因为不想特别公开联机信息出来时,透过URL夹带参数给已安装于手机中的应用程序,再与后端系统
进行互动,既可以做到与设备的结合更可以让部分安全性得到保护。
相关推荐
android很好的入门书籍,通俗易懂,值得一看。目录: 入门 1. 初探Android 2. 安装Android 开发工具 3. 开启现有专案 4. 操作Android 模拟器(Emulator) 5. 建立一个Android 程式(BMI0) ; 基础 1. 描述使用者介面 2. ...
android签到应用程序源码,涉及控件,数据库的使用~ android签到应用程序源码,涉及控件,数据库的使用~ android签到应用程序源码,涉及控件,数据库的使用~ android签到应用程序源码,涉及控件,数据库的使用~...
使用您的移动的网站或Web应用程序作为基础,此Android Studio软件包将您的内容包装成真实的原生Android应用程序!一个很好的方法来获得数百万的Google Play商店客户。无需编码,无需更多插件。它只是工作。 完整的...
Android系统结构和SDK使用;Android SDK的开发环境;Android应用程序的概述和框架;Android应用程序示例;Android应用程序的内容;Android的UI系统实现;视图组(ViewGroup)和布局(Layout)的使用
android简单实例,通过已知应用的包名打开该应用程序。
Android应用程序主要由代码和资源组成。资源主要就是指那些与UI相关的东西,例如UI布局、字符串和图片等。代码和资源分开可以使得应用程序在运行时根据实际需要来组织UI。这样就可使得应用程序只需要编译一次,就...
Android打开其他应用程序的组件,例如打开Activity,打开Service
7个Android应用程序源代码 7个Android应用程序源代码 7个Android应用程序源代码 7个Android应用程序源代码 7个Android应用程序源代码 7个Android应用程序源代码
Android开发,获取当前手机安装的所有应用、根据包名获取应用信息、获取当前应用程序的包名、获取程序 图标、获取程序的版本号、获取程序的名字、获取程序的权限、获取程序的签名、获取当前包名的 SHA1、将获取到得...
Android应用程序开发 代码与PPT 哈工程 王向辉
app-app-calling-android, 使用本教程构建应用Android调用应用程序的应用程序 #Build 一个简单的Android VoIP呼叫应用程序,带有 Sinch本教程将指导你构建一个简单的Android VoIP呼叫应用程序。 完成后,它将显示...
1.Android中获取所有应用程序列表信息 2.Android中获取系统应用程序列表信息 3.Android中获取第三方应用程序列表信息 4.Android中获取第三方应用程序列表信息
面对恶意软件的威胁,Android 使用了一套应用程序安全框架来保护安全。本文以 Android 现有的安全机制为基础,通过研究当前安全机制的不足,分析恶意软件攻击的特点,提出了多个具体的安全扩展和保护方案,达到了较好的...
android卸载已安装应用代码,提供点击打开应用功能,采用ListView显示所有已安装应用(剔除了原装应用)。 在此代码中可以学到,ListView自定义适配器的使用,ListView中给每条Item加按钮并实现ListView的Item与按钮...
Android卸载或删除应用,调用浏览器打开指定网页地址url
《Android Studio应用程序设计》(第2版,课件只有一、二、三、四章的,各章节例题源代码齐全,word编辑可直接黏贴使用。
在现在Android手机系统比较热门的环境下,此程序提供给一些入门学者参考使用,希望可以更好地帮助Android爱好者更好地入门和快速开发出Android应用程序。
Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个...掌握Android应用程序消息处理机制,有助于我们熟练地使用同步和异步编程,提高程序的运行性能
1:Android应用程序框架 2:Android应用程序的组成 3:API参考文档的使用
Android 应用程序 框架 MVC设计非常好用