如何从外部浏览开启Android App

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

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

<html>
    <head>
        <title>浏览器打开APP测试</title>
        <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.js"></script>
        <script src="https://static.mlinks.cc/scripts/dist/mlink.min.js"></script>
    </head>
    <body>
        <a id="btnOpenApp">打开APP</a>
   <script>
    new Mlink(
        {
        mlink: "Aa2F",
        button: document.querySelector('a#btnOpenApp'),
        autoLaunchApp : false,
        autoRedirectToDownloadUrl: true,
        downloadWhenUniversalLinkFailed: false,
        inapp : true,
        params: {
              storyBoardKey:'DetailsActivity',
              storyBoardId:'ProductDetail',
              name:'TwoActivity',
              productId:'1454456156'

              }
        })
   </script>
    </body>
</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上进行配置,我的是这样配置的:

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.wingsofts.magicwindowdemo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile "io.reactivex:rxandroid:1.2.0"
    compile "io.reactivex:rxjava:1.1.7"

    compile(name: 'MagicWindowSDK', ext: 'aar')
}

repositories {
    flatDir {
        dirs 'libs'
    }
}

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

package com.wingsofts.magicwindowdemo;

import android.app.Application;

import com.zxinsight.Session;

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Session.setAutoSession(this);
    }
}

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

MainActivity页面是这样的:

package com.wingsofts.magicwindowdemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void onClick(View v) {
        startActivity(new Intent(this, DetailsActivity.class));

    }
}

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.wingsofts.magicwindowdemo.MainActivity"
    >

  <Button
      android:layout_centerInParent="true"
      android:onClick="onClick"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="点我去详情页"
      />
</RelativeLayout>

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

DetailsActivity页面:

package com.wingsofts.magicwindowdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class DetailsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

    }
}

activity_details布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.wingsofts.magicwindowdemo.DetailsActivity"
    >
<TextView
    android:text="我是详情页"
    android:textSize="30sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</RelativeLayout>

TwoActivity页面:

package com.wingsofts.magicwindowdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class TwoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    }
}

对应得布局是activity_two:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wingsofts.magicwindowdemo.TwoActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="我是第二个页面"
        android:textSize="40sp"
        />

</RelativeLayout>

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

package com.wingsofts.magicwindowdemo;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.zxinsight.MLink;
import com.zxinsight.MWConfiguration;
import com.zxinsight.MagicWindowSDK;
import com.zxinsight.mlink.MLinkCallback;
import com.zxinsight.mlink.MLinkIntentBuilder;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;

public class SplashActivity extends AppCompatActivity {

    private String DEMONAME = "com.wingsofts.magicwindowdemo";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        initSDK();//初始化SDK
        registerLinks(this);//注册SDK
        initMLink();

    }

    public void initMLink() {
        Intent intent = getIntent();
        Uri mLink = intent.getData();
        //如果从浏览器传来 则进行路由操作
        if (mLink != null) {
            MLink.getInstance(this).router(this, mLink);
            finish();
        } else {
            //否则执行原本操作
            go2MainActivity();
        }
    }

    //注册SDK
    public void registerLinks(Context context) {
        MLink.getInstance(context).registerDefault(new MLinkCallback() {
            @Override
            public void execute(Map paramMap, Uri uri, Context context) {
                //默认的路由 如果没有匹配则转跳到 MainActivity 为你的首页
                MLinkIntentBuilder.buildIntent(paramMap, context, MainActivity.class);
            }
        });

        // testKey:  mLink 的 key, mLink的唯一标识,用于进行路由操作
        MLink.getInstance(context).register("productDetail", new MLinkCallback() {
            public void execute(Map paramMap, Uri uri, Context context) {

                //!!!!!!!!注意 此处有坑,如果你的SplashActivity转跳有延迟,那么在此处转跳的延迟必须大于前者转跳时间
                Observable.timer(1050, TimeUnit.MILLISECONDS)
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(aVoid -> {

                            //MLinkIntentBuilder.buildIntent(paramMap, context, Class.forName(name));

                            String name = (String) paramMap.get("name");
                            Intent intent = new Intent();
                            intent.setClassName(context, DEMONAME + "." + name);
                            startActivity(intent);
                        });
            }
        });
    }

    //初始化魔窗SDK
    public void initSDK() {
        MWConfiguration config = new MWConfiguration(this);
        config.setDebugModel(true)
                //带有Fragment的页面。具体查看2.2.2
                .setPageTrackWithFragment(true)
                //设置分享方式,如果之前有集成sharesdk,可在此开启
                .setSharePlatform(MWConfiguration.ORIGINAL);
        MagicWindowSDK.initSDK(config);
    }

    public void go2MainActivity() {

        //延迟1秒转跳
        Observable.timer(1, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(aLong -> {
                    startActivity(new Intent(this, MainActivity.class));
                    finish();
                });
    }

    private void StartActivity(Map paramMap, Context context, Class<?> clazz) {

        Intent intent = new Intent(context, clazz);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        if (paramMap != null) {

            Iterator iter = paramMap.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                String key = (String) entry.getKey();
                String val = (String) entry.getValue();
                intent.putExtra(key, val);
            }
        }
        context.startActivity(intent);

    }

}

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.wingsofts.magicwindowdemo.SplashActivity"
    >
<TextView
    android:textSize="30sp"
    android:text="我是引导页!!"
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</RelativeLayout>

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

以上就是如何从外部浏览开启Android App的详细内容,更多关于从外部浏览开启Android App的资料请关注我们其它相关文章!

(0)

相关推荐

  • android开机自启动APP及使用adb命令测试方法

    android开机自动运行APP实现方式其实很简单.在android系统运行时,会发出"android.intent.action.BOOT_COMPLETED"这个系统广播,因此我们监听它,并进行打开APP的操作即可.现在大多数的android手机系统都默认禁止第三方安装的APP开机自启动,只有系统APP(system/app)才默认有这个权限,所以一般都需要去安全中心或者手机管家中去设置为允许.这里说个题外话,手机软件除非特殊情况,不然最好不要做开机自启动,开机自启动一般适用于an

  • Android 代码设置开机自启动App的方法

    有的时候想要用户一旦打开手机.我们的APP就自动运行了. 代码如下: 创建一个监听. /** * create by:sunlei on 2017/7/7 15:48 * e-mail:872822645@qq.com * introduce: */ public class ContentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { I

  • Android实战APP启动速度优化

    APP启动速度非常重要,APP启动速度慢,可能会造成用户体验不良好,尤其是在最近用Android studio之后,如果长时间不打开app,启动速度就会特别的慢,下面我们一起探讨一下影响app启动速度的原因,以及解决方案. 检测启动时间 首先我们要知道app的启动时间,然后你也可以凭着感觉来,这里我教大家一个装逼的方法: adb shell am start -W [packageName]/[.MainActivity] 用adb命令可以检测启动时间,示例如下: ./adb shell am

  • Android中通过外部程序启动App的三种方法

    第一种:直接通过包名: 复制代码 代码如下: Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.joyodream.jiji");                 startActivity(LaunchIntent); 第二种:通过自定义的Action 复制代码 代码如下: Intent intent = new Intent();                 intent.setAc

  • 完美解决Android App启动页有白屏闪过的问题

    应用启动的时候有短暂的白屏,如图: 可以通过设置theme的方式来解决 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item

  • Android实现外部唤起应用跳转指定页面的方法

    前言 通常有这么一个场景,就是分享内容到微信朋友圈等,然后点击内容中的某个按钮就可以唤起自家应用. 这里要讲的也是使用 scheme 的方式去实现跳转,先捋一捋思路,首先如果要外部能唤醒 App ,那么 App 肯定要先注册一个全局的事件监听吧.然后,应该有一个页面来处理接受事件然后解析出具体的参数然后跳转具体的页面.就是这么简单. 思路捋好来,那么就来一一实现吧. 注册事件监听 这里需要使用到 Android Activity中的 <intent-filter> ,现在可以创建一个解析跳转的

  • Android App启动图启动界面(Splash)的简单实现代码

    第一步:创建一个Activity 第二步:创建一个新的Activity 命名为Splash new -> Activity -> Empty Activity p>第三步:将准备好的启动图片放到drawable目录下,并修改Splash的xml布局文件,如下图所示 第四步:修改SplashActivity中的代码如下 import android.content.Intent; import android.support.v7.app.AppCompatActivity; import

  • 如何从外部浏览开启Android App

    这里主要用的是第三方的东西,就是魔窗中的mlink功能.想了解魔窗的朋友就到官网去看看吧.在这里我说一下我通过魔窗是怎么实现的. 首先我们看一下浏览器上面的代码,这个就是我们从该页面上跳转打开app. <html> <head> <title>浏览器打开APP测试</title> <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.js"></script&g

  • 如何通过Battery Historian分析Android APP耗电情况

    一.电量统计模块概述 耗电信息在设置 -> 电量中能够非常直观的看到.注意,Android 所有功耗统计都是通过代码估算,没有集成电路参与汇报.准确度取决于厂商 ROM 所提供的power_profile.xml文件.由于不同厂商power_profile.xml准确度及源码有差异,因此不同手机.不同版本的数据可能有较大差异. power_profile.xml直接影响统计的准确度,并且此文件无法通过应用修改.再次强调,Android 耗电估算没有硬件的参与,全靠代码估算. power_prof

  • Android App应用退到后台显示通知的实现方法

    目录 需求背景 崩溃信息 总结 需求背景 刚开始接到这个需求时,第一时间想到的是做成跟银行类app一样用户退到主页之后,需要在通知栏显示“XXX在后台运行”,并且该通知不能被清除,只有用户重新进入app再消失.然后就想到了一个方案前台服务(foregroundService) 来实现,于是撸起袖子就是干. 1.创建一个ForegroundService继承Service 2.重写onCreate等一系列方法 3.创建通知,根据不同版本来开启服务 根据不同版本开启服务 4.监听Applicatio

  • Android App隐私合规检测辅助工具Camille详解

    目录 简介 安装 用法 后记 场景 1APP.SDK违规处理用户个人信息方面 1.1违规收集个人信息. 1.2超范围收集个人信息. 1.3违规使用个人信息. 1.4强制用户使用定向推送功能. 2设置障碍.频繁骚扰用户方面 2.1APP强制.频繁.过度索取权限. 2.2APP频繁自启动和关联启动. 3欺骗误导用户方面 3.1欺骗误导用户下载APP. 3.2欺骗误导用户提供个人信息. 参考链接 Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com

  • Android APP之WebView校验SSL证书的方法

    Android系统的碎片化很严重,并且手机日期不正确.手机根证书异常.com.google.android.webview BUG等各种原因,都会导致WebViewClient无法访问HTTPS站点.SSL错误的处理方式十分关键,如果处理不当,可能导致中间人攻击,黑客窃听数据,进而引发安全事故. 严谨地处理onReceivedSslError尤为重要.请参考以下代码,原理是:如果webview报告SSL错误,程序将会对服务器证书进行强校验,如果服务器传入证书的指纹(sha256)与记录值一致,说

  • 亲自动手实现Android App插件化

    Android插件化目前国内已经有很多开源的工程了,不过如果不实际开发一遍,很难掌握的很好. 下面是自己从0开始,结合目前开源的项目和博客,动手开发插件化方案. 按照需要插件化主要解决下面的几种问题: 1. 代码的加载 (1) 要解决纯Java代码的加载 (2) Android组件加载,如Activity.Service.Broadcast Receiver.ContentProvider,因为它们是有生命周期的,所以要特殊处理 (3) Android Native代码的加载 (4) Andro

  • 通过实例简单讲解Android App中的Activity组件

    Activity是Android应用中,最直接与用户接触的组件,它负责加载View组件,使其展现给用户,并保持与用户的交互.所有的Activity组件均需要继承Activity类,这是一个Content的间接子类,包装了一些Activity的基本特性. View组件是所有UI组件.容器组件的基类,也就是说,它可以是一个布局容器,也可以是一个布局容器内的基本UI组件.View组件一般通过XML布局资源文件定义,同时Android系统也对这些View组件提供了对应的实现类.如果需要通过某个Activ

  • Android App中实现图片异步加载的实例分享

    一.概述 一般大量图片的加载,比如GridView实现手机的相册功能,一般会用到LruCache,线程池,任务队列等:那么异步消息处理可以用哪呢? 1.用于UI线程当Bitmap加载完成后更新ImageView 2.在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待消息的到达,当有消息到达时,从任务队列按照队列调度的方式(FIFO,LIFO等),取出一个任务放入线程池中进行处理. 简易的一个流程:当

  • 详解Android App中的AsyncTask异步任务执行方式

    基本概念 AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作.AsyncTask允许我们的执行一个异步的任务在后台.我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件.通过AsyncTask我们可以轻松的解决多线程之间的通信问题. 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我

  • Android APP启动方式、启动流程及启动优化分析

    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识!  app应用启动方式 1.冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动.冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量.布局.绘制),最后显示在界面上. 2.热启动 当启动应用时,后台已有该应用的进程(例:按

随机推荐