• 从外部浏览开启app


    先描述一下需求:从浏览器中点击某个按钮,如果手机上装有相应的app,则直接开启app,并且到相对的页面。如果没有装该app,则会到相应的下载app的界面。

    我这里主要用的是第三方的东西,就是魔窗中的mlink功能。想了解魔窗的朋友就到官网去看看吧。在这里我说一下我通过魔窗是怎么实现的。

    首先我们看一下浏览器上面的代码,这个就是我们从该页面上跳转打开app。

     1 <html>
     2     <head>
     3         <title>浏览器打开APP测试</title>
     4         <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.js"></script>
     5         <script src="https://static.mlinks.cc/scripts/dist/mlink.min.js"></script>
     6     </head>
     7     <body>
     8         <a id="btnOpenApp">打开APP</a>
     9    <script>
    10     new Mlink(
    11         {
    12         mlink: "Aa2F",
    13         button: document.querySelector('a#btnOpenApp'),
    14         autoLaunchApp : false,
    15         autoRedirectToDownloadUrl: true,
    16         downloadWhenUniversalLinkFailed: false,
    17         inapp : true,
    18         params: {
    19               storyBoardKey:'DetailsActivity',
    20               storyBoardId:'ProductDetail',
    21               name:'TwoActivity',
    22               productId:'1454456156'
    23               
    24               }
    25         })
    26    </script>
    27     </body>
    28 </html>
    mlink: "Aa2F",这个Aa2F就是我们在魔窗上配置的一个短链接最后面的mlink,比如,我的短链接是:http://a.mlinks.cc/Aa2F;
    button: document.querySelector('a#btnOpenApp'),
    autoLaunchApp : false,
    autoRedirectToDownloadUrl: true,
    downloadWhenUniversalLinkFailed: false,
    inapp : true,
    这些在官网上都有解释,我就不解释了;
    params就是我们要传递的参数。
    好了,现在到了关键时刻了,就是我们app上面的配置了,先看我的项目目录:

    先把魔窗这个包倒进来,然后在gradle上进行配置,我的是这样配置的:

     1 apply plugin: 'com.android.application'
     2 apply plugin: 'me.tatarka.retrolambda'
     3 android {
     4     compileSdkVersion 24
     5     buildToolsVersion "24.0.0"
     6 
     7     defaultConfig {
     8         applicationId "com.wingsofts.magicwindowdemo"
     9         minSdkVersion 15
    10         targetSdkVersion 24
    11         versionCode 1
    12         versionName "1.0"
    13     }
    14     buildTypes {
    15         release {
    16             minifyEnabled false
    17             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    18         }
    19     }
    20     compileOptions {
    21         targetCompatibility 1.8
    22         sourceCompatibility 1.8
    23     }
    24 }
    25 
    26 dependencies {
    27     compile fileTree(dir: 'libs', include: ['*.jar'])
    28     testCompile 'junit:junit:4.12'
    29     compile 'com.android.support:appcompat-v7:24.1.1'
    30     compile "io.reactivex:rxandroid:1.2.0"
    31     compile "io.reactivex:rxjava:1.1.7"
    32 
    33     compile(name: 'MagicWindowSDK', ext: 'aar')
    34 }
    35 
    36 repositories {
    37     flatDir {
    38         dirs 'libs'
    39     }
    40 }

    然后在看看Myapp页面,我的是这样的:

     1 package com.wingsofts.magicwindowdemo;
     2 
     3 import android.app.Application;
     4 
     5 import com.zxinsight.Session;
     6 
     7 
     8 public class MyApp extends Application {
     9 
    10     @Override
    11     public void onCreate() {
    12         super.onCreate();
    13 
    14         Session.setAutoSession(this);
    15     }
    16 }

    这里的session的作用是获取到活动。

    MainActivity页面是这样的:

     1 package com.wingsofts.magicwindowdemo;
     2 
     3 import android.content.Intent;
     4 import android.os.Bundle;
     5 import android.support.v7.app.AppCompatActivity;
     6 import android.view.View;
     7 
     8 public class MainActivity extends AppCompatActivity {
     9 
    10     @Override
    11     protected void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         setContentView(R.layout.activity_main);
    14 
    15     }
    16 
    17 
    18     public void onClick(View v) {
    19         startActivity(new Intent(this, DetailsActivity.class));
    20 
    21     }
    22 }
    activity_main:
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:tools="http://schemas.android.com/tools"
     5     android:layout_width="match_parent"
     6     android:layout_height="match_parent"
     7     android:paddingBottom="@dimen/activity_vertical_margin"
     8     android:paddingLeft="@dimen/activity_horizontal_margin"
     9     android:paddingRight="@dimen/activity_horizontal_margin"
    10     android:paddingTop="@dimen/activity_vertical_margin"
    11     tools:context="com.wingsofts.magicwindowdemo.MainActivity"
    12     >
    13 
    14   <Button
    15       android:layout_centerInParent="true"
    16       android:onClick="onClick"
    17       android:layout_width="wrap_content"
    18       android:layout_height="wrap_content"
    19       android:text="点我去详情页"
    20       />
    21 </RelativeLayout>

    上面这两个页面就没什么好介绍的了,很平常的两个页面。

    DetailsActivity页面:

     1 package com.wingsofts.magicwindowdemo;
     2 
     3 import android.os.Bundle;
     4 import android.support.v7.app.AppCompatActivity;
     5 
     6 public class DetailsActivity extends AppCompatActivity {
     7 
     8     @Override
     9     protected void onCreate(Bundle savedInstanceState) {
    10         super.onCreate(savedInstanceState);
    11         setContentView(R.layout.activity_details);
    12 
    13     }
    14 }

    activity_details布局:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:tools="http://schemas.android.com/tools"
     5     android:layout_width="match_parent"
     6     android:layout_height="match_parent"
     7     android:paddingBottom="@dimen/activity_vertical_margin"
     8     android:paddingLeft="@dimen/activity_horizontal_margin"
     9     android:paddingRight="@dimen/activity_horizontal_margin"
    10     android:paddingTop="@dimen/activity_vertical_margin"
    11     tools:context="com.wingsofts.magicwindowdemo.DetailsActivity"
    12     >
    13 <TextView
    14     android:text="我是详情页"
    15     android:textSize="30sp"
    16     android:layout_width="wrap_content"
    17     android:layout_height="wrap_content"
    18     />
    19 </RelativeLayout>

    TwoActivity页面:
     1 package com.wingsofts.magicwindowdemo;
     2 
     3 import android.support.v7.app.AppCompatActivity;
     4 import android.os.Bundle;
     5 
     6 public class TwoActivity extends AppCompatActivity {
     7 
     8     @Override
     9     protected void onCreate(Bundle savedInstanceState) {
    10         super.onCreate(savedInstanceState);
    11         setContentView(R.layout.activity_two);
    12     }
    13 }

    对应的布局是activity_two:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:tools="http://schemas.android.com/tools"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     tools:context="com.wingsofts.magicwindowdemo.TwoActivity">
     7 
     8 
     9     <TextView
    10         android:layout_width="match_parent"
    11         android:layout_height="match_parent"
    12         android:text="我是第二个页面"
    13         android:textSize="40sp"
    14         />
    15 
    16 </RelativeLayout>

    下面这一个页面很重要,基本上所有的重要代码都集中在这里:

      1 package com.wingsofts.magicwindowdemo;
      2 
      3 import android.content.Context;
      4 import android.content.Intent;
      5 import android.net.Uri;
      6 import android.os.Bundle;
      7 import android.support.v7.app.AppCompatActivity;
      8 
      9 import com.zxinsight.MLink;
     10 import com.zxinsight.MWConfiguration;
     11 import com.zxinsight.MagicWindowSDK;
     12 import com.zxinsight.mlink.MLinkCallback;
     13 import com.zxinsight.mlink.MLinkIntentBuilder;
     14 
     15 import java.util.Iterator;
     16 import java.util.Map;
     17 import java.util.concurrent.TimeUnit;
     18 
     19 import rx.Observable;
     20 import rx.android.schedulers.AndroidSchedulers;
     21 
     22 
     23 public class SplashActivity extends AppCompatActivity {
     24 
     25     private String DEMONAME = "com.wingsofts.magicwindowdemo";
     26 
     27 
     28     @Override
     29     protected void onCreate(Bundle savedInstanceState) {
     30         super.onCreate(savedInstanceState);
     31         setContentView(R.layout.activity_splash);
     32 
     33         initSDK();//初始化SDK
     34         registerLinks(this);//注册SDK
     35         initMLink();
     36 
     37 
     38     }
     39 
     40 
     41     public void initMLink() {
     42         Intent intent = getIntent();
     43         Uri mLink = intent.getData();
     44         //如果从浏览器传来 则进行路由操作
     45         if (mLink != null) {
     46             MLink.getInstance(this).router(this, mLink);
     47             finish();
     48         } else {
     49             //否则执行原本操作
     50             go2MainActivity();
     51         }
     52     }
     53 
     54 
     55     //注册SDK
     56     public void registerLinks(Context context) {
     57         MLink.getInstance(context).registerDefault(new MLinkCallback() {
     58             @Override
     59             public void execute(Map paramMap, Uri uri, Context context) {
     60                 //默认的路由 如果没有匹配则转跳到 MainActivity 为你的首页
     61                 MLinkIntentBuilder.buildIntent(paramMap, context, MainActivity.class);
     62             }
     63         });
     64 
     65 
     66         // testKey:  mLink 的 key, mLink的唯一标识,用于进行路由操作
     67         MLink.getInstance(context).register("productDetail", new MLinkCallback() {
     68             public void execute(Map paramMap, Uri uri, Context context) {
     69 
     70                 //!!!!!!!!注意 此处有坑,如果你的SplashActivity转跳有延迟,那么在此处转跳的延迟必须大于前者转跳时间
     71                 Observable.timer(1050, TimeUnit.MILLISECONDS)
     72                         .observeOn(AndroidSchedulers.mainThread())
     73                         .subscribe(aVoid -> {
     74 
     75                             //MLinkIntentBuilder.buildIntent(paramMap, context, Class.forName(name));
     76 
     77                             String name = (String) paramMap.get("name");
     78                             Intent intent = new Intent();
     79                             intent.setClassName(context, DEMONAME + "." + name);
     80                             startActivity(intent);
     81                         });
     82             }
     83         });
     84     }
     85 
     86     //初始化魔窗SDK
     87     public void initSDK() {
     88         MWConfiguration config = new MWConfiguration(this);
     89         config.setDebugModel(true)
     90                 //带有Fragment的页面。具体查看2.2.2
     91                 .setPageTrackWithFragment(true)
     92                 //设置分享方式,如果之前有集成sharesdk,可在此开启
     93                 .setSharePlatform(MWConfiguration.ORIGINAL);
     94         MagicWindowSDK.initSDK(config);
     95     }
     96 
     97 
     98     public void go2MainActivity() {
     99 
    100         //延迟1秒转跳
    101         Observable.timer(1, TimeUnit.SECONDS)
    102                 .observeOn(AndroidSchedulers.mainThread())
    103                 .subscribe(aLong -> {
    104                     startActivity(new Intent(this, MainActivity.class));
    105                     finish();
    106                 });
    107     }
    108 
    109     private void StartActivity(Map paramMap, Context context, Class<?> clazz) {
    110 
    111         Intent intent = new Intent(context, clazz);
    112         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    113         if (paramMap != null) {
    114 
    115             Iterator iter = paramMap.entrySet().iterator();
    116             while (iter.hasNext()) {
    117                 Map.Entry entry = (Map.Entry) iter.next();
    118                 String key = (String) entry.getKey();
    119                 String val = (String) entry.getValue();
    120                 intent.putExtra(key, val);
    121             }
    122         }
    123         context.startActivity(intent);
    124 
    125     }
    126 
    127 
    128 }

    布局:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:tools="http://schemas.android.com/tools"
     5     android:layout_width="match_parent"
     6     android:layout_height="match_parent"
     7     android:paddingBottom="@dimen/activity_vertical_margin"
     8     android:paddingLeft="@dimen/activity_horizontal_margin"
     9     android:paddingRight="@dimen/activity_horizontal_margin"
    10     android:paddingTop="@dimen/activity_vertical_margin"
    11     tools:context="com.wingsofts.magicwindowdemo.SplashActivity"
    12     >
    13 <TextView
    14     android:textSize="30sp"
    15     android:text="我是引导页!!"
    16     android:layout_centerInParent="true"
    17     android:layout_width="wrap_content"
    18     android:layout_height="wrap_content"
    19     />
    20 </RelativeLayout>

    代码上面的我都有注释,在这里需要注意的是,传递参数的话一定要配置好,否则会出现错误。

    
    
    
    
    
    
    
  • 相关阅读:
    第一行代码--笔记(1)
    iOS UITableView深入
    iOS 数据库主键重复,依然可以插入
    UILabel文本高度自适应 不同系统出现问题
    UIlabel上的文字 距上 居左 对齐
    UILabel 自定义字体
    【整理】--VC 编译整理
    【整理】--【内核模块】简单例子,编译加载
    【原创】-- uboot,kennel,fs,rootfs 编译制作
    【原创】-- nfs安装配置及使用,挂载根文件系统
  • 原文地址:https://www.cnblogs.com/huangjialin/p/6089100.html
Copyright © 2020-2023  润新知