Android 最简单的应用间跳转小结

2023-11-17

不明所以的图示

play

通过 JumpOrigin 可以打开 JumpMe,以下简结了4种方式。

1. 通过查找包名直接启动 APP

这种方法最直接,通过解析包名,判断该应用是否安装,如果安装了就可以直接启动,也能够传递参数,代码如下, 傻瓜式打开应用:

 private boolean startAppByPackageID(String packageId) {
        PackageManager packageManager = getPackageManager();
        PackageInfo packageInfo;
        try {
            // 应用包名
            packageInfo = packageManager.getPackageInfo( packageId, 0);
        } catch (PackageManager.NameNotFoundException e) {
            Toast.makeText(MainActivity.this, "没有找到 应用", Toast.LENGTH_SHORT).show();
            return true;
        }
        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(packageInfo.packageName);
        List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);
        ResolveInfo ri = apps.iterator().next();
        if (ri != null) {
            String className = ri.activityInfo.name;
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            ComponentName cn = new ComponentName(packageInfo.packageName, className);
            intent.setComponent(cn);
            // 参数
            intent.putExtra(Intent.EXTRA_TEXT , getUrl());
            startActivity(intent);
        }
        return false;
    }

当然也可以通过自定义 action 和 category 打开特定的 Activity:

        <activity android:name=".Main2Activity">
            <intent-filter>
                <action android:name="afra.action.MAIN" />

                <category android:name="afra.category.LAUNCHER" />
            </intent-filter>
        </activity>
private boolean startAppByPackageID(String packageId) {
        PackageManager packageManager = getPackageManager();
        PackageInfo packageInfo;
        try {
            // 应用包名
            packageInfo = packageManager.getPackageInfo( packageId, 0);
        } catch (PackageManager.NameNotFoundException e) {
            Toast.makeText(MainActivity.this, "没有找到 应用", Toast.LENGTH_SHORT).show();
            return true;
        }
        // 自定 action 和 category
        String custom_action = "afra.action.MAIN";
        String custom_category = "afra.category.LAUNCHER";
        Intent resolveIntent = new Intent(custom_action, null);
        resolveIntent.addCategory(custom_category);
        resolveIntent.setPackage(packageInfo.packageName);
        List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);
        ResolveInfo ri = apps.iterator().next();
        if (ri != null) {
            String className = ri.activityInfo.name;
            Intent intent = new Intent(custom_action);
            intent.addCategory(custom_category);
            ComponentName cn = new ComponentName(packageInfo.packageName, className);
            intent.setComponent(cn);
            // 参数
            intent.putExtra(Intent.EXTRA_TEXT , getUrl());
            startActivity(intent);
        }
        return false;
    }

2. 使用分享启动 APP

Android 里,可以分享 文本图片视频等格式,让系统自己判断由 谁去获取这些文件,那么我们就可以通过分享的方式打开 APP。
在应用内Intent 过滤:

            <intent-filter>
                <action android:name="android.intent.action.SEND" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="afra/afra" />
            </intent-filter>
    private void startSharedApp() {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, getUrl());

        // 规定一个 type 类型
        shareIntent.setType("afra/afra");
        startActivity(shareIntent);
    }

3. 直接发送广播启动应用

这种方式已经废弃了,因为 Android 系统不能让app 一直存活在后台,如果 app 被杀死,就没法监听到广播,也就没法自己启动。

4. 使用 Intent.ACTION_VIEW 的形式启动

就是 url link 的形式启动,我们先要定一个 url 协议, 比如

afra://afra.api?pid=1234&caNum=4321&backUrl=http://www.baidu.com

然后进行过滤:

             <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="afra.api"
                    android:scheme="afra" />
            </intent-filter>

就可以以 Intent.ACTION_VIEW 的形式启动:

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("afra://afra.api?pid=1234&caNum=4321&backUrl=http://www.baidu.com"));
        context.startActivity(intent);

如果是在 WebView 中唤起的,就必须开启 JavaScript 功能:

webview.getSettings().setJavaScriptEnabled(true);

注意:如果设置了 webview 的 WebViewClient 就需要如下类似处理:

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.i("Url", url);
        try {
            if (TextUtils.equals(Uri.parse(url).getScheme(), "afra")) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                context.startActivity(intent);
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.shouldOverrideUrlLoading(view, url);
    }

附录:如何回调数据

这里建议广播回调。
首先要规定一个 action,做唯一 action 的监听,例如:

com.afra55.afra

在他们启动我们的应用后,我们发一个广播给他们,并把数据传递给他们:

                Intent intent = new Intent();
                intent.putExtra(Intent.EXTRA_TEXT, parse.getQuery());
                intent.setAction("com.afra55.afra");
                context.sendBroadcast(intent);

在他的应用里需要在需要的页面监听广播:

public static class HandleReceiver extends BroadcastReceiver{

        private WebView mWebView;
        public HandleReceiver(WebView webView) {
            mWebView = webView;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            String extras = printBundle(bundle);
            Log.d("HandleReceiver", "[JPushReceiver] onReceive - " + intent.getAction() + ", extras: " + extras);

            mWebView.loadData("" +
                            "<a href=\""+ getUrl() +  "\">你已经启动了应用并拿到了数据:\n " + extras + "</a> "
                    , "text/html; charset=UTF-8", null);
        }
        private String printBundle(Bundle bundle) {
            if (bundle == null) {
                return null;
            }
            StringBuilder sb = new StringBuilder();
            for (String key : bundle.keySet()) {
                sb.append("\nkey:").append(key).append(", value:").append(bundle.getString(key));
            }
            return sb.toString();
        }
    }

在相应的生命周期注册监听:

        IntentFilter filter = new IntentFilter("com.afra55.afra");
        HandleReceiver receiver = new HandleReceiver(mWebView);

        // 在 view 销毁的时候再 unregister
        registerReceiver(receiver, filter);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 最简单的应用间跳转小结 的相关文章

随机推荐

  • cloudflare解析域名+CDN

    cloudflare解析域名 CloudFlare 是一家全球知名的 CDN 服务商 并且提供了免费的 CDN 套餐 还不限流量 所以我们完全不需要花一分钱就能使用它的 CDN 服务 接下来我就说明如何注册并使用 CloudFlare 1
  • C/C++中的数据结构对齐,#pragma pack() 和 __attribute__

    C C 中的数据结构对齐 总览 数据结构对齐是指在计算机内存中排列和访问数据的方式 它包含三个独立但相关的问题 数据对齐 data alignment 数据结构填充 data structure padding 和打包 packing 当数
  • Servlet传送对象给Applet使用

    前日 一位朋友与我谈论Servlet与Applet共享Java对象的问题 现发表出来与大家分享 文中瑕癖 之处甚多 望各位指教 朋友谈论的需求是这样的 他想通过页面上一个Applet呼叫一个服务器Servlet 而从Servlet产生 一个
  • Anaconda3安装TensorFlow2.0.0镜像并且配置好Jupyter Notebook

    我们安装TensorFlow1 2 1但是后面又要安装Tensorflow2 0 0 那么我们就需要让Tensorflow两个版本在windows电脑下进行共存 首先 我们先下载了anacoda3和配置好了清华镜像 我们打开anaconda
  • 从零开始编译OpenWrt固件

    从零开始编译OpenWrt固件 前言 进来阅读这篇文章的相信都是对OpenWrt有一定的了解的 对于OpenWrt的介绍这里就不再赘述 可以自行查找相关百科了解 OpenWrt是适合于嵌入式设备的一个Linux发行版 可以通过其提供的相关工
  • Docker使用基础命令(记录贴)

    Docker使用基础命令 基础命令 拉取 推送镜像 docker run命令 基础操作 保存镜像并压缩 基础命令 docker images grep xxx docker ps a grep xxx 导入容器 docker load i
  • vue+antD 表格中使用input

    vue antD 表格中使用input 在这里插入代码片
  • 【编程与算法基础】数据结构——时间复杂度与空间复杂度

    文章目录 算法的时间复杂度和空间复杂度 一 前言 1 算法的效率 2 复杂度的表示方法 大O渐进表示法 3 大O渐进表示法的规则 二 时间复杂度 1 时间复杂度的概念 2 简单时间复杂度计算举例 3 复杂时间复杂度的计算举例 三 空间间复杂
  • C++实践之Qt学习(六):Qt设计器之常用控件、布局和样式

    文章目录 常用控件 按钮 普通按钮 单选按钮 多选按钮 其他的按钮 显示控件 标签 其他显示控件 输入控件 数据项控件 容器控件 布局 Qt布局介绍 设置布局的方式 样式 外部样式表 常用控件 按钮 Buttons分类中包含了Qt中常用的按
  • Appium使用教程(七)——获取appPackage和appActivity

    appPackage和appActivity 进行appium自动化测试非常重要的两个参数 我们所测试的APP不同 这两个参数肯定也是不一样的 那如何快速的获取这APP的这两个参数呢 我这里介绍五个方法 方法一 最简单有效的方法 通过cmd
  • Ubuntu 之 docker 无法下载镜像

    问题 使用 docker pull 命令拉取镜像出现如下错误 解决方案 1 在 etc docker 中创建 daemon json 文件 vim etc docker daemon json 2 写入 registry mirrors h
  • Android 夜间模式(白/夜间模式的切换)

    在项目研发中 我们避免不了需求中会应用到夜间模式 这里对它做一些总结以及封装 从API 23后 Android就有自带的api能够实现夜间模式与白天模式的切换 Support Library 23 2 应用于API14 推出了适合Andro
  • 逐点比较法实现直线圆弧插补[数控机床]

    逐点比较法实现不同象限直线 圆弧插补 一 原理介绍 1 1 简介 1 2 逐点比较法偏差计算 直线 1 2 1 第一象限逐点比较法思路 1 2 2 四象限逐点比较法实现思路 1 3 逐点比较法偏差计算 圆弧 1 3 1 第一象限逐点比较法思
  • 笔记:快速上手shell编程

    SHELL学习笔记 变量赋值 赋值 A 10 不允许 赋值时不允许在等号两侧出现空格 A 10 允许 A 10 不允许 A 10 允许 当赋值时需要填充多个空格 可以使用 环境变量 root localhost gitee echo PWD
  • tf1.x和tf2.x查看TFRecord数据的方法

    Tensorflow 1 x和Tensorflow 2 x读取tfrecord方法略有不同 下面分别记录两段代码 Tensorflow 1 x for example in tf python io tf record iterator p
  • React基础之Refs的理解与使用

    目录 为什么会用到Refs 何时使用Refs Refs有哪些使用方式 字符串形式的refs 回调形式的refs createRef的使用 为什么会用到Refs 我们在使用React写代码的时候对Refs的使用比较少 因为我们很少直接操作底层
  • 常用DOC命令

    copy con 123 bat 创建批处理 color 改变cmd颜色 ping t l 65550 ip 死亡之ping ipconfig 查看ip ipconfig release 释放ip ipconfig renew 重获ip s
  • arm下蜂鸣器测试代码

    首先还是看内核蜂鸣器的实现 如下图 这个和led一样 都是比较简单的字符驱动 代码如下 include
  • JS 触发事件整理

    一般事件 onclick IE3 N2鼠标点击时触发此事件 ondblclick IE4 N4鼠标双击时触发此事件 onmousedown IE4 N4按下鼠标时触发此事件 onmouseup IE4 N4鼠标按下后松开鼠标时触发此事件 o
  • Android 最简单的应用间跳转小结

    不明所以的图示 通过 JumpOrigin 可以打开 JumpMe 以下简结了4种方式 1 通过查找包名直接启动 APP 这种方法最直接 通过解析包名 判断该应用是否安装 如果安装了就可以直接启动 也能够传递参数 代码如下 傻瓜式打开应用