网页内启动客户端程序——Android
2014-12-07 19:29
387 查看
背景:最近做东西看见了一个在移动端网页直接打开客户端程序并跳转自定义界面的例子,就琢磨研究下,发现实际中的用途比自己想的还要多。
用途:
1.通过网页中的内容直接调用客户端的自定义页面。
2.微信、微博等大部分开放的sdk中直接通过分享按钮打开程序。
实现原理:
主要是通过在入口Activity的intent-filter添加过滤的方式来实现调用和传值等操作。
源码:
1.网络端:(发布页面的Express项目,如果需要可以下载)
页面使用了一个新建的NodeJS的Express项目来发布自己的测试Html页面,其中只是添加了一个a标签并使用href的url进行app的调用。
<a href="m://code41.com:9000?action=entryActivity¶ms='String in TextView'">OpenApp</a>
2.Android端:
分为两种情况:一种是浏览器中调用链接打开程序(主要),另外一种是webview中打开链接。
主要说说第一种情况。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.code41.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.code41.demo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<span style="color:#ff0000;"><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:host="code41.com"
android:port="9000"
android:scheme="m" />
</intent-filter></span>
</activity>
<activity android:name="com.code41.demo.WebviewActivity" >
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>PS:此处补充小坑一个,就是标红部分,这是主要主要让功能起作用的代码,但是必须与启动的Main和Launcher的filter分成两个,否则程序无法启动。
此处URI的解释内容如下:
就Android平台而言,URI主要分三个部分:scheme, authority和path。其中authority又分为host和port。格式如下:
scheme://host:port/path
举个实际的例子:
content://com.example.project:200/folder/subfolder/etc
\---------/ \---------------------------/ \---/ \--------------------------/
scheme host port path
\--------------------------------/
authority
现在大家应该知道data flag中那些属性的含义了吧,看下data flag
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
除此之外,通过在url后面拼接以下内容来进行参数的传入,同时可以通过getIntent中的方法进行参数的获取?action=entryActivity¶ms='String in TextView'
MainActivity
<span style="color:#333333;">public class MainActivity extends Activity {
private final String tag = MainActivity.class.getName();
private Handler mHandler = new Handler();
private TextView helloTextView;
private Button goButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helloTextView = (TextView) findViewById(R.id.text_view_hello);
goButton = (Button) findViewById(R.id.button_go);
</span><span style="color:#ff0000;">Uri uri = getIntent().getData();
if (null != uri) {
final String action = uri.getQueryParameter("action");
final String params = uri.getQueryParameter("params");
Log.i(tag, action + "<=>" + params);
post(new Runnable() {
@Override
public void run() {
helloTextView.setText(params);
}
});
}</span><span style="color:#333333;">
goButton.setOnClickListener(new OnClickListener() {
@Override
p
4000
ublic void onClick(View v) {
startActivity(new Intent(MainActivity.this, WebviewActivity.class));
}
});
}
private void post(Runnable runnable) {
if (isFinishing() || null == mHandler) {
return;
}
mHandler.post(runnable);
}
}
</span>主要的获取参数和启动程序的代码就已经结束了,下面补充自己的webView调用链接的情况。
public class WebviewActivity extends Activity {
private final String tag = WebviewActivity.class.getName();
private WebView openAppWebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
openAppWebview = (WebView) findViewById(R.id.webview_load_open_url);
openAppWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
<span style="color:#ff0000;">Uri uri = Uri.parse(url);
if ("m".equals(uri.getScheme()) && "code41.com".equals(uri.getHost())) {
String action = uri.getQueryParameter("action");
String params = uri.getQueryParameter("params");
Log.i(tag, action+"<=>"+params);
} else {
openAppWebview.loadUrl(url);
}</span>
return true;
}
});
openAppWebview.loadUrl("http://192.168.1.112:3000");
}
}
效果截图:
![](https://img-blog.csdn.net/20141207192744117?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZTQxX2NvZGVtb25rZXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20141207192850370?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZTQxX2NvZGVtb25rZXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Android部分源码下载
用途:
1.通过网页中的内容直接调用客户端的自定义页面。
2.微信、微博等大部分开放的sdk中直接通过分享按钮打开程序。
实现原理:
主要是通过在入口Activity的intent-filter添加过滤的方式来实现调用和传值等操作。
源码:
1.网络端:(发布页面的Express项目,如果需要可以下载)
页面使用了一个新建的NodeJS的Express项目来发布自己的测试Html页面,其中只是添加了一个a标签并使用href的url进行app的调用。
<a href="m://code41.com:9000?action=entryActivity¶ms='String in TextView'">OpenApp</a>
2.Android端:
分为两种情况:一种是浏览器中调用链接打开程序(主要),另外一种是webview中打开链接。
主要说说第一种情况。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.code41.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.code41.demo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<span style="color:#ff0000;"><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:host="code41.com"
android:port="9000"
android:scheme="m" />
</intent-filter></span>
</activity>
<activity android:name="com.code41.demo.WebviewActivity" >
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>PS:此处补充小坑一个,就是标红部分,这是主要主要让功能起作用的代码,但是必须与启动的Main和Launcher的filter分成两个,否则程序无法启动。
此处URI的解释内容如下:
就Android平台而言,URI主要分三个部分:scheme, authority和path。其中authority又分为host和port。格式如下:
scheme://host:port/path
举个实际的例子:
content://com.example.project:200/folder/subfolder/etc
\---------/ \---------------------------/ \---/ \--------------------------/
scheme host port path
\--------------------------------/
authority
现在大家应该知道data flag中那些属性的含义了吧,看下data flag
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
除此之外,通过在url后面拼接以下内容来进行参数的传入,同时可以通过getIntent中的方法进行参数的获取?action=entryActivity¶ms='String in TextView'
MainActivity
<span style="color:#333333;">public class MainActivity extends Activity {
private final String tag = MainActivity.class.getName();
private Handler mHandler = new Handler();
private TextView helloTextView;
private Button goButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helloTextView = (TextView) findViewById(R.id.text_view_hello);
goButton = (Button) findViewById(R.id.button_go);
</span><span style="color:#ff0000;">Uri uri = getIntent().getData();
if (null != uri) {
final String action = uri.getQueryParameter("action");
final String params = uri.getQueryParameter("params");
Log.i(tag, action + "<=>" + params);
post(new Runnable() {
@Override
public void run() {
helloTextView.setText(params);
}
});
}</span><span style="color:#333333;">
goButton.setOnClickListener(new OnClickListener() {
@Override
p
4000
ublic void onClick(View v) {
startActivity(new Intent(MainActivity.this, WebviewActivity.class));
}
});
}
private void post(Runnable runnable) {
if (isFinishing() || null == mHandler) {
return;
}
mHandler.post(runnable);
}
}
</span>主要的获取参数和启动程序的代码就已经结束了,下面补充自己的webView调用链接的情况。
public class WebviewActivity extends Activity {
private final String tag = WebviewActivity.class.getName();
private WebView openAppWebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
openAppWebview = (WebView) findViewById(R.id.webview_load_open_url);
openAppWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
<span style="color:#ff0000;">Uri uri = Uri.parse(url);
if ("m".equals(uri.getScheme()) && "code41.com".equals(uri.getHost())) {
String action = uri.getQueryParameter("action");
String params = uri.getQueryParameter("params");
Log.i(tag, action+"<=>"+params);
} else {
openAppWebview.loadUrl(url);
}</span>
return true;
}
});
openAppWebview.loadUrl("http://192.168.1.112:3000");
}
}
效果截图:
Android部分源码下载
相关文章推荐
- Android客户端程序启动后没有反应,服务器一切正常(解决)
- 浏览器网页判断手机是否安装IOS/Android客户端程序
- 在网页中启动调用客户端桌面程序
- android客户端程序和网页浏览的程序的区别
- 启动Android程序后调用默认的浏览器打开一个网页
- 网页启动客户端程序代码
- 从浏览器启动客户端程序
- android程序启动画面之Splash总结
- 网页打开客户端本机程序,未安装则提示要求安装
- 怎样在android系统启动时自动运行自己的程序
- Android程序开机启动&&监听情景模式切换
- android客户端程序访问服务器端webservice,几篇不错的文章!
- Android程序无法启动的问题
- 程序进入Android Market(网页或者应用)
- 如何用adb命令启动你的Android程序
- Android 启动程序
- 在实机和模拟器上,android 程序启动时前期输出信息的区别
- Android AM命令行启动程序的方法
- android soup web客户端程序
- 在Android命令行启动程序的方法