不明所以的图示

通过 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 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("" +                            "+ getUrl() +  "\">你已经启动了应用并拿到了数据:\n " + extras + " "                    , "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);

更多相关文章

  1. Android(安卓)O Treble框架
  2. Android系统启动之配置文件解析
  3. Android按键监听和AsyncTask异步处理
  4. Android(安卓)SearchView 焦点问题
  5. 1-Android基础知识
  6. android定位服务
  7. eclipse 创建android项目 无法启动
  8. Android蓝牙耳机录音
  9. Activity的属性之—launchMode

随机推荐

  1. Android(安卓)Canvas绘图详解【转】
  2. 使用SmsManager服务群发短信
  3. android中get方式和post方式提交数据到服
  4. Android代码内存优化建议-Android官方篇
  5. 检查网络连接状况
  6. 解决错误ERROR: No suitable Java found.
  7. android studio常用快捷键整理
  8. Android(安卓)Studio常用快捷键、Android
  9. 通过apk签名使应用程序有系统权限
  10. android 使程序完全退出及退回到主界面