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 最简单的应用间跳转小结的主要内容,如果未能解决你的问题,请参考以下文章