从你自己的(意图)打开另一个应用程序

我知道如何更新我自己的程序,我知道如何使用预定义的Uri打开程序(例如,用于短信或电子邮件)

我需要知道如何创build一个意图打开MyTracks或任何其他应用程序,我不知道他们听什么意图。

我从DDMS获得了这个信息,但是我没有成功地把它转换成我可以使用的意图。 这是从手动打开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) 

首先,Android中“应用程序”的概念稍微延伸一点。

应用程序(技术上讲是一个进程)可以有多个活动,服务,内容提供者和/或广播监听者。 如果其中至less有一个正在运行,则应用程序启动并运行(进程)。

所以,你要确定的是你想如何“启动应用程序”。

好的…这里是你可以尝试的:

  1. action=MAINcategory=LAUNCHER创build一个intent
  2. 使用context.getPackageManager从当前上下文获取PackageManager
  3. packageManager.queryIntentActivity(<intent>, 0) where intent has category=LAUNCHERaction=MAIN or packageManager.resolveActivity(<intent>, 0) to get first activity with main / launcher
  4. 获取您感兴趣的ActivityInfo
  5. ActivityInfo获取packageNamename
  6. 最后,使用category=LAUNCHERaction=MAINcomponentName = new ComponentName(packageName, name)setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)创build另一个意图。
  7. 最后, context.startActivity(newIntent)

我有这样的工作,

 /** 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"); 

希望它可以帮助别人。

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

编辑:

如注释中所示,在startActivity(intent);之前添加一行startActivity(intent);

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

如果你已经有了你想要激活的包名,你可以使用下面的代码:

 PackageManager pm = context.getPackageManager(); Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName); if (null != appStartIntent) { context.startActivity(appStartIntent); } 

我发现,对于主要活动没有通过开始主要活动的常规方法find的情况,它更好。

这是基于MasterGaurav解决scheme的解决scheme的代码:

 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(); } } 

使用inversus的解决scheme,我扩展了一个函数的代码片段,当所需的应用程序没有被安装的时候会被调用。 所以它的工作原理是: 按包名运行应用程序。 如果没有find,打开Android市场 – 谷歌玩这个包

 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"); 

打开应用程序,如果它存在,或者打开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))); } } } 

用这个 :

  PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("com.package.name"); startActivity(intent); 

从我的应用程序Activity启动另一个应用程序活动。 它对我来说工作得很好。

下面的代码将工作,如果另一个应用程序已经安装在您的手机,否则不能将一个应用程序redirect到另一个应用程序。所以请确保您的应用程序启动或不

 Intent intent = new Intent(); intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity"); startActivity(intent); 

//这适用于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; } 

由于应用程序不允许更改许多电话设置,因此可以像另一个应用程序一样打开设置活动。

手动实际修改设置后,查看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 } 

对于API级别3+,只有一行代码:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

返回一个CATEGORY_INFO启动Intent(没有启动程序的应用程序,例如墙纸,经常使用它来提供一些关于应用程序的信息),如果没有find它,则返回包的CATEGORY_LAUNCH(如果存在)。

如果你试图开始一个服务,而不是活动,这对我工作:

 Intent intent = new Intent(); intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName"); context.startService(intent); 

如果您使用其他答案中提到的intent.setComponent(…)方法,则可能会收到“带有startService的隐式意图不安全”警告。

另外,你也可以在另一个应用程序中打开你的应用程序的意图:

 Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

其中uri是其他应用程序的深层链接

使用以下:

 String packagename = "com.example.app"; startActivity(getPackageManager().getLaunchIntentForPackage(packagename)); 

从Android上的另一个应用程序启动应用程序

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage"); startActivity(launchIntent); 

使用意图到另一个活动所以这个链接是非常有用的意图到一个页面

另一页。

http://blogingtutorials.blogspot.com/2010/11/using-intent-in-android-one-page-to.html

如果有任何困难,然后给我反馈。 我解决了这个问题。

试试这个代码,希望这会帮助你。 如果这个软件包可用,那么这将打开应用程序,否则打开下载的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))); } } 
 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(new ComponentName("package_name","package_name.class_name")); intent.putExtra("grace", "Hi"); startActivity(intent);