网页内启动客户端程序——Android

来源:互联网 发布:js拼接字符串的方法 编辑:程序博客网 时间:2024/06/17 01:45

背景:最近做东西看见了一个在移动端网页直接打开客户端程序并跳转自定义界面的例子,就琢磨研究下,发现实际中的用途比自己想的还要多。

用途:

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;@Overrideprotected 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() {@Overridepublic void run() {helloTextView.setText(params);}});}</span><span style="color:#333333;">goButton.setOnClickListener(new OnClickListener() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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部分源码下载














0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车辆超速扣12分怎么办 一次超速扣12分怎么办 分扣了罚款未交怎么办 c照一次扣12分怎么办 人在外地身份证到期了怎么办 手机进水了屏幕不亮怎么办 北京一证通过期怎么办 小米6音量键进水怎么办 考驾照怕过不了怎么办 学车对车没感觉怎么办 居住证到期2个月怎么办 生育险差一个月怎么办 驾照扣了38分怎么办 新疆转入山东上学怎么办手续 驾照过日期换证怎么办 机动车被扣24分怎么办 车辆被扣24分怎么办 现在深圳牌十年老车怎么办? 护士证过期4年了怎么办 护士资格证延续注册过期了怎么办 护士资格证过期没注册怎么办 护士资格证注册时间过期怎么办 辅警体检视力不行怎么办 护士延续注册体检怀孕怎么办 护士资格证没有延续注册怎么办 申请信用卡没有座机号码怎么办 网上申请信用卡没有座机号码怎么办 我叫上门服务被骗了怎么办 上门服务被骗了3000多怎么办 微信被骗9000元怎么办 奥迪a8气囊灯亮怎么办 驾考站岗迟到了怎么办 老板欠员工工资不给怎么办 如果有一天我没头发了怎么办 苏州公积金密码忘了怎么办 科二考试第二把怎么办 科一老是记不住怎么办 科目二考试没去怎么办 网约车驾龄不到怎么办 科四预约不上怎么办 教练不退钱怎么办找谁