背景:通过其他项目、网页链接打开自己的app
1、通过其他项目打开自己的app
其实就是通过隐式Intent打开Activity(为方便描述简称其他项目为:A,自己的app为:B)
首先B项目中activity设置intent-filter
android:name=".ThridActivity">
android:name="android.intent.action.VIEW" />
android:name="android.intent.category.DEFAULT" />
android:name="android.intent.category.BROWSABLE" />
android:scheme="market"
android:host="com.trywang.jartest"
android:path="/abc" />
到此为止B项目设置完成,只要在A中写上打开B的代码就可以了,代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("market://com.trywang.jartest/abc?param=1234")); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent);上面 “market://com.trywang.jartest/abc”就是B项目中配置的 data标签至于后面带的“ ?param=1234"则是带的参数,多个参数使用“?param1=12¶m2=34¶m3=56”即可,参数可以在 ThridActivity中的onCreate()或者onStart()方法获取
不过在打开的代码中一般为了验证你要打开的Intent存在的话需要检查一下,否则你打开一个不存在的Intent则造成自己的程序崩溃。代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("market://com.trywang.jartest/abc?abc=1234")); intent.addCategory(Intent.CATEGORY_DEFAULT); PackageManager packageManager = getPackageManager(); List activities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); boolean isIntentSafe = activities.size() > 0; if (isIntentSafe) { startActivity(intent); }
B项目中ThridActivity的onCreate()方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_thrid); TextView tv = (TextView) findViewById(R.id.tv); Intent intent = getIntent(); Uri uri = intent.getData(); if (uri != null) { String param = uri.getQueryParameter("param");//参数获取 } }
这样就可以。其实这些在官网上都有,其实我主要想mark一下在WebView中通过连接打开的方式。官网链接
2、通过在A中通过WebView打开B的ThridActivity
B中配置以上不变,只是在A中打开的代码少许更改。
webview.html关键代码:
href="market://com.trywang.jartest/abc?abc=1234">点击链接
webview设置
mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JsInterface(),"Android"); mWebView.setWebChromeClient(new WebChromeClient(){ }); //mWebView.setWebViewClient()
mWebView.loadUrl("file:///android_asset/webview.html");
2.1 不设置webview.setWebViewClient()则打开系统的浏览器,此时点击链接一样打开B的ThridActivity
2.2 设置webview.setWebViewClient()则只能通过他的重写方法shouldOverrideUrlLoading()方法进行跳转,如果不重写此方法进行跳转则无法跳转!
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d(TAG, "shouldOverrideUrlLoading:1111 " + url); Intent intent = null; try { intent = Intent.parseUri(url,Intent.URI_INTENT_SCHEME); } catch (URISyntaxException e) { e.printStackTrace(); return false; } startActivity(intent); return true; } });主要看intent = Intent.parseUri(url,Intent.URI_INTENT_SCHEME)代码,将url路径转换为intent。此处只是简单的进行跳转处理,项目中根据自身情况进行逻辑重写。
同样在浏览器输入“market://com.trywang.jartest/abc”也能打开,不过对浏览器有要求:好像只能系统浏览器或者google chrome的某些版本以上的才能打开,其他的浏览器打不开,如有好方法欢迎备注!
参考资料:
Create Deep Links to App Content
允许其他应用启动您的 Activity