您的位置:首页 > 移动开发 > Android开发

网页内启动客户端程序——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");
}
}

效果截图:


   


Android部分源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android