Android(安卓)最简单的应用间跳转小结
16lz
2021-01-26
不明所以的图示
通过 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);
更多相关文章
- Android(安卓)O Treble框架
- Android系统启动之配置文件解析
- Android按键监听和AsyncTask异步处理
- Android(安卓)SearchView 焦点问题
- 1-Android基础知识
- android定位服务
- eclipse 创建android项目 无法启动
- Android蓝牙耳机录音
- Activity的属性之—launchMode