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

不明所以的图示

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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值