博客出自:刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主,转载注明出处! All Rights Reserved !
这个问题解决了两天时间,因为网上没有完整的解决方案,解决后分享一下给大家!
原理:路由。
通过配置scheme、host和path等信息即Filter,告诉项目自己可以处理哪些信息,并且将参数带过去处理的一种思路。
解决这个问题有两个作用:
1、不用打开App直接进入某页面
2、实现App分享到外部,同时由外部进入App的闭环。
这个话题可以分两方面来讲,一方面是从微信进入App,另一方面是从网页进入App。
咱们拿更新:通过浏览器直接打开Android应用程序 - Cundong's log - OSCHINA - 中文开源技术交流社区当例子来讲一下
主要通过scheme、host、path、pathPrefix等data信息来区分
两个方案都需要给跳转到的Activity加入intent-filter信息,例如
<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="cundong" android:host="splash"/>
</intent-filter>
首先我们来讲微信端进入App,场景:从App分享内容到微信,再从微信直接打开App。
第一步,注册微信公众平台,相关企业信息,下载链接,Logo等 都填写完毕
第二步,分享时使用WXAppExtendObject,把链接url赋值给extInfo
/** * 创建微信分享消息体 * * @return */ private SendMessageToWX.Req buildWXBody() { WXAppExtendObject webObj = new WXAppExtendObject(); webObj.extInfo = mShareUrl; // 用WXTextObject对象初始化一个WXMediaMessage对象 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = webObj; msg.title = buildTitle(mShareTitle); // 发送文本类型的消息时,title字段不起作用 // msg.title = "Will be ignored"; msg.description = buildShareText(false, mShareContent); if (mShareBgPic == null) { mShareBgPic = ImageUtils.drawBg4Bitmap(Color.WHITE, mSharePic); } int size = ImageUtils.getBitmapSize(mShareBgPic); if (size > 1024 * 32) {//添加对大图片的处理 mShareBgPic = ImageUtils.compress(mShareBgPic, 25); } msg.setThumbImage(mShareBgPic); // 构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("weixin"); // transaction字段用于唯一标识一个请求 req.message = msg; return req; }
第三步,在IWXAPIEventHandler接口的onReq方法的req.getType()=ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX时,发起你的跳转
第四步,跳转时需要数据,数据从哪里来,从WXEntryActivity类中onCreate方法的getIntent对象里来
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 接收自微信的Intent intent = getIntent(); try { if (intent != null) { api = WXAPIFactory.createWXAPI(this,WX_APP_ID, true); // 注册处理函数 api.handleIntent(intent, this); } } catch (Exception e) { // TODO: handle exception } } // 微信发送请求到第三方应用时,会回调到该方法 @Override public void onReq(BaseReq req) { switch (req.getType()) { case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: break; case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: Intent intentWeb = new Intent(this, MainActivity.class); try { //有可能微信没传过来相关值 if (intent.hasExtra("_wxappextendobject_extInfo")) { Bundle bundle = intent.getExtras(); String url = bundle.getString("_wxappextendobject_extInfo"); String title = bundle.getString("_wxobject_title"); if (!TextUtils.isEmpty(url)) { intentWeb = new Intent(this, WebActivity.class); intentWeb.putExtra(ILXConstants.KEY_INTENT_TITLE, title); intentWeb.putExtra(ILXConstants.KEY_INTENT_URL, url); intentWeb.putExtra(ILXConstants.KEY_INTENT_FROM, "wx"); } } } catch (Exception e) { // TODO: handle exception } startActivity(intentWeb); finish(); break; default: break; } }
从微信进入App就这样结束了。
-------------------我是分割线------------------------
接着来讲网页端,由于webView的限制,如微信、微博等都采用这个控件,所以只能分享到网页,再进入App。
原理如下:
<div>
<a id="J-call-app" href="javascript:;" class="label">立即打开>></a>
<input id="J-download-app" type="hidden" name="storeurl" value="http://apk.hiapk.com/appinfo/com.tmall.wireless">
</div>
<script>
(function(){
var ua = navigator.userAgent.toLowerCase();
var t;
var url=document.location;
var config = {
/*scheme:必须*/
scheme_IOS: 'cundong://',
scheme_Adr: 'cundong://splash',
download_url: document.getElementById('J-download-app').value,
timeout: 600
};
function openclient() {
var startTime = Date.now();
var ifr = document.createElement('iframe');
//alert(config.scheme_Adr);
ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
ifr.style.display = 'none';
document.body.appendChild(ifr);
var t = setTimeout(function() {
var endTime = Date.now();
if (!startTime || endTime - startTime < config.timeout -200) {
window.location = config.download_url;
} else {
window.location.href=ifr.src.replace("http://","cundong://");;
}
}, config.timeout);
window.onblur = function() {
clearTimeout(t);
}
}
window.addEventListener("DOMContentLoaded", function(){
document.getElementById("J-call-app").addEventListener('click',openclient,false);
}, false);
})()
</script>点击打开四个字后,执行一个js,在限制时间内,如果可以打开App则打开,否则进入下载页
解决这个问题的基本思路就是这样,欢迎大家交流探讨!
Android如何从外部跳进App
于 2015-05-28 21:08:32 首次发布