android后台如何获取客户端传来的值,Android APP调起另外一个APP并传值

概述

为了增加用户体验,可能要求在一个APP中打开另外一个APP的需求,一般分为三种:

显式调用跳转

隐式调用跳转

URL Scheme跳转

代码

用到的一些公共方法,当打开APP时,检测到第三方APP没安装时调到应用市场进行下载,应用市场找不到相应的APP就跳转到系统浏览器进行下载。

/**

* 判断apk是否安装

*

* @param context

* @return

*/

public static boolean isAppInstalled(Context context, String packageName) {

PackageManager pm = context.getPackageManager();

try {

pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);

return true;

} catch (PackageManager.NameNotFoundException e) {

return false;

}

}

/**

* 通过包名 在应用商店打开应用

*

* @param context 上下文

* @param packageName 包名

* @param url 下载App的官方链接

*/

public void openApplicationMarket(Context context, String packageName, String url) {

try {

String str = "market://details?id=" + packageName;

Intent localIntent = new Intent(Intent.ACTION_VIEW);

localIntent.setData(Uri.parse(str));

context.startActivity(localIntent);

} catch (Exception e) {

e.printStackTrace();

// 调用系统浏览器进行下载

Toast.makeText(context, "打开应用商店失败", Toast.LENGTH_SHORT).show();

openLinkBySystem(context, url);

}

}

/**

* 调用系统浏览器打开网页或下载链接

*

* @param url 地址

*/

public void openLinkBySystem(Context context, String url) {

Uri uri = Uri.parse(url);

Intent intent = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(intent);

}

1、显式调用跳转

第一种:

Intent intent = new Intent();

//包名 包名+类名(全路径)

intent.setClassName("com.demo.surfaceviewdemo", "com.demo.surfaceviewdemo.JumpTestActivity");

intent.putExtra("data", "123");

startActivity(intent);

第二种:

Intent intent = new Intent();

//包名 包名+类名(全路径)

ComponentName comp = new ComponentName("com.demo.surfaceviewdemo","com.demo.surfaceviewdemo.JumpTestActivity");

intent.setComponent(comp);

intent.setAction("android.intent.action.MAIN");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.putExtra("data", "123");

startActivity(intent);

setClassName内部也是调用的setComponent。

2、隐式调用跳转

调用方:

//这里用到了隐式意图,来启动APP里面的Activity

Intent intent = new Intent();

intent.setAction("app.intent.action.VIEW");

intent.addCategory("android.intent.category.DEFAULT");

intent.putExtra("data", "123");

startActivity(intent);

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

被调用方数据接收:

Intent intent = getIntent();

Bundle bundle = intent.getExtras();

if (bundle != null) {

String data = bundle.getString("data");

Log.e("JumpTestActivity", data);

}

3、URL Scheme

第一种:

url =protocol + authority(host + port) + path + query

协议protocol: https

页面path: /data

参数query: param=Tom&param2=Cat

authority = host + port

端口port: 443

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

html,

body {

height: 100%;

margin: 0;

padding: 0;

overflow-y: hidden;

}

button {

margin: 80% auto 0 auto;

display: block;

border: none;

outline: none;

border: 1px solid orange;

width: 200px;

text-align: center;

height: 40px;

line-height: 40px;

background-color: white;

border-radius: 10px;

font-size: 18px;

color: orange;

}

a {

text-decoration : none;

}

打开第三方APP

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

第二种:隐式调用

PackageManager packageManager = getPackageManager();

Intent intent = new Intent(Intent.ACTION_VIEW,

Uri.parse("myapp://jump.app/open?param=Tom&param2=Cat"));

List activities =packageManager.queryIntentActivities(intent, 0);

boolean isValid = !activities.isEmpty();

if (isValid) {

startActivity(intent);

} else {

Toast.makeText(context, "打开第三方APP失败", Toast.LENGTH_SHORT).show();

}

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

android:host="jump.app"

android:scheme="myapp"

android:pathPrefix="/open"/>

被调用Activity中数据接收:

Uri uri = getIntent().getData();

if (uri != null) {

// 完整的url信息

String url = uri.toString();

Log.e(TAG, "url: " + url);

// scheme部分

String scheme = uri.getScheme();

Log.e(TAG, "scheme: " + scheme);

// host部分

String host = uri.getHost();

Log.e(TAG, "host: " + host);

//port部分

int port = uri.getPort();

Log.e(TAG, "port: " + port);

// 访问路劲

String path = uri.getPath();

Log.e(TAG, "path: " + path);

List pathSegments = uri.getPathSegments();

// Query部分

String query = uri.getQuery();

Log.e(TAG, "query: " + query);

//获取指定参数值

String param = uri.getQueryParameter("param");

Log.e(TAG, "param: " + param);

//获取指定参数值

String param2 = uri.getQueryParameter("param2");

Log.e(TAG, "param2: " + param2);

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值