首先我们来实现场景1,APP “A” 是我们自己开发的我们可以改动APP的源代码和配置。
首先在APP中创建一个Activity “LaunchActivityByBrowerLink”
1
2
3
4
5
6
7
|
public
class
LaunchActivityByBrowerLink
extends
Activity
{
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
)
;
}
}
|
接下来在Mainfest 配置这个activity:
1
2
3
4
5
6
7
8
|
<
activity
android
:
name
=
".LaunchActivityByBrowerLink"
>
<
intent
-
filter
>
<
action
android
:
name
=
"android.intent.action.VIEW"
/
>
<
category
android
:
name
=
"android.intent.category.DEFAULT"
/
>
<
category
android
:
name
=
"android.intent.category.BROWSABLE"
/
>
<
data
android
:
scheme
=
"coolbeetle"
android
:
host
=
"mmmkapp"
android
:
pathPrefix
=
"/openothers"
/
>
<
/
intent
-
filter
>
<
/
activity
>
|
我们可以看到在这个APP定义了data这个属性定义了scheme,合格参数就类似于URL中”http”,host类似于服务器地址,pathPrefix “/openothers” 就是path.通过data定义的属性就可以发现已经有一个完整的URL了 “coolbeetle://mmmkapp/openothers”。
所以在HTML页面加个连接 “直接启动APP ”
首先我们来实现场景2: 当这个应用”A” 是别人开发的我们无法添加场景1中所提到的配置,是不是就不能通过网页的形式来启动了呢?答案是可以的,我们可以先想象哪里有类似的场景。其实就是我们常用的应用管理软件,如”豌豆荚”、”google play” 等。他们的应用就直接启动我们手机上安装的应用,为什么可以呢?答案就是Android中的PackageManager,请看如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
ArrayList
<ApplicationItemInfo>
applicationItemInfoList
=
new
ArrayList
<ApplicationItemInfo>
(
)
;
PackageManager
packageManager
=
this
.
getPackageManager
(
)
;
List
<PackageInfo>
packageInfoList
=
packageManager
.
getInstalledPackages
(
0
)
;
Intent
mainIntent
=
new
Intent
(
Intent
.
ACTION_MAIN
,
null
)
;
List
<ResolveInfo>
aList
=
packageManager
.
queryIntentActivities
(
mainIntent
,
0
)
;
for
(
int
i
=
packageInfoList
.
size
(
)
;
i
>
0
;
i
--
)
{
ApplicationInfo
applicationInfo
=
packageInfoList
.
get
(
i
-
1
)
.
applicationInfo
;
if
(
(
applicationInfo
.
flags
&
ApplicationInfo
.
FLAG_SYSTEM
)
<=
0
)
{
try
{
ApplicationItemInfo
applicationItemInfo
=
new
ApplicationItemInfo
(
)
;
String
packageName
=
packageInfoList
.
get
(
i
-
1
)
.
packageName
;
String
[
]
permissions
=
packageManager
.
getPackageInfo
(
packageName
,
PackageManager
.
GET_PERMISSIONS
)
.
requestedPermissions
;
//applicationItemInfo.setClassName(applicationInfo.className);
applicationItemInfo
.
setPackageName
(
packageName
)
;
applicationItemInfo
.
setPermissions
(
permissions
)
;
applicationItemInfo
.
setIcon
(
packageManager
.
getApplicationIcon
(
applicationInfo
)
)
;
applicationItemInfo
.
setName
(
packageManager
.
getApplicationLabel
(
applicationInfo
)
.
toString
(
)
)
;
applicationItemInfoList
.
add
(
applicationItemInfo
)
;
}
catch
(
NameNotFoundException
e
)
{
// TODO Auto-generated catch block
}
}
}
|
上面的代码告诉我们我们可以代码先获取APP “a”的 “packageName”
在继续看下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
String
tempName
=
""
;
for
(
int
i
=
0
;
i
<
applicationItemInfoList
.
size
(
)
;
++
i
)
{
tempName
=
applicationItemInfoList
.
get
(
i
)
.
getPackageName
(
)
;
for
(
int
j
=
0
;
j
<
aList
.
size
(
)
;
++
j
)
{
if
(
tempName
.
equals
(
aList
.
get
(
j
)
.
activityInfo
.
applicationInfo
.
packageName
)
)
{
applicationItemInfoList
.
get
(
i
)
.
setClassName
(
aList
.
get
(
j
)
.
activityInfo
.
name
)
;
}
}
}
|
我们可以看到通过上面的代码可以看到 APP “A”的 className
想象当我们有了APP的 className 和 packageName之后我们是否可以启动了这个APP呢? 答案是当然可以 因为在Android中我们有 Intent 和CompnentName 见如下代码:定义了一个Activity来启动APP A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
class
LaunchActivityByBrowerLink
extends
Activity
{
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
)
;
try
{
Intent
startApp
=
new
Intent
(
)
;
ComponentName
component
=
new
ComponentName
(
"com.mm.android.direct.gdmssphoneLite"
,
"com.mm.android.direct.gdmssphoneLite.SplashActivity"
)
;
startApp
.
setComponent
(
component
)
;
startApp
.
setAction
(
Intent
.
ACTION_MAIN
)
;
startActivity
(
startApp
)
;
}
catch
(
Exception
e
)
{
Toast
.
makeText
(
this
,
"找不到要启动的应用程序,请先下载安装!"
,
Toast
.
LENGTH_SHORT
)
.
show
(
)
;
e
.
printStackTrace
(
)
;
}
this
.
finish
(
)
;
}
}
|
如此一来在场景1中我们可以启动一个我们自己的应用A 通过我们自己的应用A中的一个Activity就可以启动我们手机上安装的任何应用了。
其实到这里我们也可以看到做到场景2的效果,有一个条件,就是这个HTML页面必须是我们自己可以改动源码应用的一部分,例如作为应用的一个页面是通过webview来呈现的,我们自己的应用是作为中间一个桥梁作用的体现。
最后说明,如果这个应用A虽然我们不能改动源码,但是开发这个应用的人员也预留了URI来供请求,就不需要上面场景2中的开发步骤了!
文章的代码顺序通常也是实现功能基本的思路。如转载,请指明转载此文章的地址。
本片文章中的代码片段是作者项目中的一些剪辑,如果需要完整代码,可以在关于作者页面找到联系方式,来联系作者获取免费的实例完整代码。