网页内启动客户端程序——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
			public 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部分源码下载














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值