最近项目一个新需求: 从浏览器打开本地app,并打开指定商品详情界面
记录一下实现过程
前提:和前端约定好scheme 约束:前端代码:
<a href="browserToClient//?id=62fb9330120d4055a546af29abbf0e3d">测试android</a> | |
<br> |
1.在清单文件中给splash Activity(app的第一个界面)添加一个 intent-filter(代码中的第二个):
添加筛选配置如下
<activity android:name=".activity.WelcomeActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@style/Theme.Start"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </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="browserToClient" /> </intent-filter> </activity>2.在splash Activity的oncreate方法中做一些判断
用来区分本次打开是正常点击app启动,还是从外部浏览器启动,还要判断应用栈内的activity数量(用于判断关闭商品详情界面后的跳转),
Intent intent = getIntent(); if (Intent.ACTION_VIEW.equals(intent.getAction())) { //外部连接打开app boolean b = AppManager.getInstance().getmActivityStack().size() > 1; Log.e(TAG, "onCreate:栈内activity数: "+AppManager.getInstance().getmActivityStack().size()); if(b){//应用在此前已经打开 Intent intent1 = new Intent(); intent1.setClass(this, DetailsGoodsNewWebActivity.class);//目标activity Uri data = intent.getData(); String id = data.getQueryParameter("id"); intent1.putExtra("goodsId",id); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent1); finish(); }else{ //应用在此前没有打开 Intent intent1 = new Intent(); intent1.setClass(this, HomeActivity.class);//应用的主页 Uri data = intent.getData(); String id = data.getQueryParameter("id"); intent1.putExtra("goodsId",id); // intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent1); finish(); } }else{ //内部,或手机图标启动 initApp();// 初始化APP startApp(); }3.在主页activity中oncreate中做判断
if(goodsId!=null){ Intent intent1 = new Intent(); intent1.setClass(this, DetailsGoodsNewWebActivity.class);//目标activity intent1.putExtra("goodsId",goodsId); startActivity(intent1); }
注:前端代码只是用来测试,前端还需要判断用户是否安装了本应用,核心方法(判断scheme在1.2秒内是否有匹配):
$('a').click(function() {
location.href = '自定义 URL scheme';
t = Date.now();
setTimeout(function(){
if (Date.now() - t < 1200) {
location.href = 'Android 下载地址';
}
}, 1000);
return false;
}
}
完成!