從外部瀏覽開啟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>

代碼上面的我都有注釋,在這里需要注意的是,傳遞參數的話一定要配置好,否則會出現錯誤。

 

 
        
 
        
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM