从您自己的(意图)打开另一个应用程序
Posted
技术标签:
【中文标题】从您自己的(意图)打开另一个应用程序【英文标题】:Open another application from your own (intent) 【发布时间】:2011-02-16 07:55:28 【问题描述】:我知道如何更新我自己的程序,并且我知道如何使用预定义的 Uri 打开程序(例如用于短信或电子邮件)
我需要知道如何创建一个 Intent 来打开 MyTracks 或任何其他我不知道他们听什么意图的应用程序。
我从 DDMS 获得了此信息,但我未能成功地将其转换为我可以使用的 Intent。这是从手动打开 MyTracks 时获取的。
感谢您的帮助
05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417]
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids=3003, 1015
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)
【问题讨论】:
【参考方案1】:我有这样的工作,
/** Open another app.
* @param context current Context, like Activity, App, or Service
* @param packageName the full package name of the app to open
* @return true if likely successful, false if unsuccessful
*/
public static boolean openApp(Context context, String packageName)
PackageManager manager = context.getPackageManager();
try
Intent i = manager.getLaunchIntentForPackage(packageName);
if (i == null)
return false;
//throw new ActivityNotFoundException();
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
return true;
catch (ActivityNotFoundException e)
return false;
示例用法:
openApp(this, "com.google.android.maps.mytracks");
希望对某人有所帮助。
【讨论】:
因为 getLaunchIntentForPackage("app package name") 可能会导致异常。 这是一个很好的答案,简单地捕获异常并做你需要的事情,通知用户等 不要成为一个固执己见的人,但鉴于您使用getLaunchIntentForPackage
调用的结果,没有理由在第一行分配一个新的 Intent。
getLaunchIntentForPackage()
已经添加了分类,见来源:github.com/android/platform_frameworks_base/blob/master/core/…
对我来说唯一的问题是Context
对象在哪里/如何获取/创建它?以及要导入哪些包。用于 Android 开发的 Java 中的新功能。【参考方案2】:
首先,Android 中的“应用程序”概念是一个扩展的概念。
一个应用程序 - 从技术上讲是一个流程 - 可以有多个活动、服务、内容提供者和/或广播监听器。如果其中至少有一个正在运行,则应用程序已启动并正在运行(进程)。
所以,你要确定的是你想如何“启动应用程序”。
好的...您可以尝试以下方法:
-
使用
action=MAIN
和category=LAUNCHER
创建意图
使用context.getPackageManager
从当前上下文中获取PackageManager
packageManager.queryIntentActivity(<intent>, 0)
其中intent 有category=LAUNCHER
、action=MAIN
或packageManager.resolveActivity(<intent>, 0)
以使用main/launcher 获得第一个活动
获取您感兴趣的ActivityInfo
从ActivityInfo
获取packageName
和name
最后,使用category=LAUNCHER
、action=MAIN
、componentName = new ComponentName(packageName, name)
和setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
创建另一个意图
最后,context.startActivity(newIntent)
【讨论】:
如果我想打开三个独立的应用程序怎么办? 如果你知道包名***.com/a/7596063/379115,下面的社区wiki回答会更好 如何在调用应用和启动应用之间传递数据?我找到了“Intent.putExtra()”,但我不知道如何在启动的应用程序中检索额外数据。onCreate
=> Bundle extras = getIntent().getExtras()
=> if(extras != null) extras.getString("blah")
等
getPackageManager().getLaunchIntentForPackage()
已经为您完成了所有工作github.com/android/platform_frameworks_base/blob/master/core/…【参考方案3】:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
编辑:
按照cmets的建议,在startActivity(intent);
前加一行
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
【讨论】:
但需要知道活动名称 我尝试了这个并且得到一个错误,建议使用 FLAG_ACTIVITY_NEW_TASK 标志。我在 startActivity 之前添加了这一行并且它起作用了:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @njzk2 在 Google Play 上查找软件包名称很容易;它就在 URL 中。例如:play.google.com/store/apps/… @iceybobby 是的,包名很容易找到,但是如何找到要启动的活动的类名? @phreakhead 你是对的。我想我在这个答案中使用了解决方案:***.com/a/8944286/1224186 所以不需要活动名称,所以我认为这让我对 njzk2 的回复在这里没有帮助。【参考方案4】:如果你已经有了想要激活的包名,你可以使用下面的更通用的代码:
PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
context.startActivity(appStartIntent);
我发现它更适用于通过常规启动 MAIN 活动的方法找不到主要活动的情况。
【讨论】:
对我来说最好的答案 :-) 对我有帮助。谢谢 非常适合我。非常感谢 Muzikant :)【参考方案5】:这是我基于 MasterGaurav 解决方案的解决方案代码:
private void launchComponent(String packageName, String name)
Intent launch_intent = new Intent("android.intent.action.MAIN");
launch_intent.addCategory("android.intent.category.LAUNCHER");
launch_intent.setComponent(new ComponentName(packageName, name));
launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(launch_intent);
public void startApplication(String application_name)
try
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info:resolveinfo_list)
if(info.activityInfo.packageName.equalsIgnoreCase(application_name))
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
break;
catch (ActivityNotFoundException e)
Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
【讨论】:
【参考方案6】:使用 inversus 的解决方案,我用一个函数扩展了 sn-p,该函数将在当前未安装所需应用程序时调用。所以它的工作方式如下:按包名运行应用程序。如果未找到,请打开 Android 市场 - Google play 以获取此软件包。
public void startApplication(String packageName)
try
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info : resolveInfoList)
if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
return;
// No match, so application is not installed
showInMarket(packageName);
catch (Exception e)
showInMarket(packageName);
private void launchComponent(String packageName, String name)
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setComponent(new ComponentName(packageName, name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
private void showInMarket(String packageName)
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
它是这样使用的:
startApplication("org.teepee.bazant");
【讨论】:
【参考方案7】:使用这个:
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.package.name");
startActivity(intent);
【讨论】:
有什么想法吗?打开一个 test.apk 而不是安装在现有应用程序内部的设备商店中。单击存储在现有项目中的按钮午餐 test.apk 应用程序时的提示。非常感谢。【参考方案8】:如果存在则打开应用程序,或打开 Play Store 应用程序进行安装:
private void open()
openApplication(getActivity(), "com.app.package.here");
public void openApplication(Context context, String packageN)
Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null)
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
else
try
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
catch (android.content.ActivityNotFoundException anfe)
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
【讨论】:
应该是 if (i != null)【参考方案9】:从我的应用程序 Activity 启动另一个应用程序活动。它对我来说很好用。
如果您的手机中已经安装了另一个应用程序,则以下代码将起作用,否则无法从一个应用程序重定向到另一个应用程序。因此请确保您的应用程序是否已启动
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
【讨论】:
请不要写出与同一个问题几乎相同的多个答案。使用答案下方的“编辑”链接并更改原件。【参考方案10】:// 这适用于 Android Lollipop 5.0.2
public static boolean launchApp(Context context, String packageName)
final PackageManager manager = context.getPackageManager();
final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
if ((null != resolveInfos) && (!resolveInfos.isEmpty()))
for (ResolveInfo rInfo : resolveInfos)
String className = rInfo.activityInfo.name.trim();
String targetPackageName = rInfo.activityInfo.packageName.trim();
Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
if (packageName.trim().equals(targetPackageName))
Intent intent = new Intent();
intent.setClassName(targetPackageName, className);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
return true;
return false;
【讨论】:
【参考方案11】:如果你想打开另一个应用程序并且它没有安装,你可以将它发送到谷歌应用商店下载
首先创建openOtherApp方法为例
public static boolean openOtherApp(Context context, String packageName)
PackageManager manager = context.getPackageManager();
try
Intent intent = manager.getLaunchIntentForPackage(packageName);
if (intent == null)
//the app is not installed
try
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
catch (ActivityNotFoundException e)
//throw new ActivityNotFoundException();
return false;
intent.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(intent);
return true;
catch (ActivityNotFoundException e)
return false;
2.- 用法
openOtherApp(getApplicationContext(), "com.packageappname");
【讨论】:
【参考方案12】:由于不允许应用程序更改许多手机设置,因此您可以像打开另一个应用程序一样打开设置活动。
在您实际手动修改设置后查看 LogCat 输出:
INFO/ActivityManager(1306): Starting activity: Intent act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings from pid 1924
然后使用它来显示您应用中的设置页面:
String SettingsPage = "com.android.settings/.DevelopmentSettings";
try
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));
intent.addCategory(Intent.CATEGORY_LAUNCHER );
startActivity(intent);
catch (ActivityNotFoundException e)
log it
【讨论】:
【参考方案13】:对于 API 级别 3+,仅一行代码:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");
返回一个 CATEGORY_INFO 启动 Intent(没有启动器活动的应用程序,例如壁纸,通常使用它来提供有关应用程序的一些信息),如果找不到它,则返回包的 CATEGORY_LAUNCH(如果存在)。
【讨论】:
【参考方案14】:如果您尝试启动服务而不是活动,这对我有用:
Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);
如果您使用其他答案中提到的 intent.setComponent(...) 方法,您可能会收到“带有 startService 的隐式意图不安全”的警告。
【讨论】:
【参考方案15】:或者,您也可以在其他应用中打开您的应用的意图:
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
uri
是指向其他应用的深层链接
【讨论】:
【参考方案16】:使用以下:
String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
【讨论】:
【参考方案17】:从 Android 上的另一个应用程序启动一个应用程序
Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
startActivity(launchIntent);
【讨论】:
【参考方案18】:试试这个代码,希望对你有帮助。如果此包可用,则这将打开应用程序或打开 Play 商店进行下载
String packageN = "aman4india.com.pincodedirectory";
Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null)
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
else
try
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
catch (android.content.ActivityNotFoundException anfe)
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
【讨论】:
【参考方案19】:您可以使用此命令查找设备上安装的软件包名称:
adb shell pm list packages -3 -f
参考:http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/
【讨论】:
【参考方案20】:Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name","package_name.class_name"));
intent.putExtra("grace", "Hi");
startActivity(intent);
【讨论】:
以上是关于从您自己的(意图)打开另一个应用程序的主要内容,如果未能解决你的问题,请参考以下文章