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

Posted AAA啊哈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 最简单的应用间跳转小结相关的知识,希望对你有一定的参考价值。

不明所以的图示

通过 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);

以上是关于Android 最简单的应用间跳转小结的主要内容,如果未能解决你的问题,请参考以下文章

iOS--应用间跳转

Android Activity间跳转与传递数据

应用间跳转

ios应用间跳转

iOS应用间跳转详解

社交分享和应用间跳转