我知道如何更新自己的程序,我知道如何使用预定义的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)
答案 0 :(得分:227)
我这样做了,
/** 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");
希望它有所帮助。
答案 1 :(得分:140)
首先,Android中“应用程序”的概念略有扩展。
应用程序 - 从技术上讲是一个过程 - 可以有多个活动,服务,内容提供者和/或广播听众。如果其中至少有一个正在运行,则应用程序已启动并正在运行(该过程)。
所以,你需要确定的是你想如何“启动应用程序”。
好的......这是你可以试试的:
action=MAIN
和category=LAUNCHER
PackageManager
context.getPackageManager
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)
答案 2 :(得分:95)
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);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
答案 3 :(得分:38)
如果您已经拥有要激活的软件包名称,则可以使用以下代码,这些代码更通用:
PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
context.startActivity(appStartIntent);
}
我发现,对于通过常规方法启动MAIN活动未找到主要活动的情况,它更有效。
答案 4 :(得分:13)
这是我的解决方案基于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();
}
}
答案 5 :(得分:10)
使用来自inversus的解决方案,我使用一个函数扩展了代码段,当目前尚未安装所需的应用程序时将调用该函数。所以它的工作方式如下:按包名运行应用程序。如果没有找到,请打开Android手机市场 - Google Play for this package 。
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");
答案 6 :(得分:6)
打开应用程序(如果存在),或打开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)));
}
}
}
答案 7 :(得分:5)
使用此:
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.package.name");
startActivity(intent);
答案 8 :(得分:4)
从我的应用程序活动中启动另一个应用程序活动。它对我来说很好。
如果手机中已安装了另一个应用程序,则代码将有效,否则无法将一个应用程序重定向到另一个应用程序。所以确保您的应用程序已启动
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
答案 9 :(得分:3)
//这适用于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;
}
答案 10 :(得分:2)
如果您尝试启动服务而不是活动,这对我有用:
Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);
如果您使用其他答案中提到的intent.setComponent(...)方法,您可能会收到“带有startService的隐式意图不安全”警告。
答案 11 :(得分:2)
如果您想要打开另一个应用程序并且未安装它,您可以将其发送到Google App Store进行下载
首先创建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 :(得分:2)
Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
startActivity(launchIntent);
答案 13 :(得分:2)
使用以下内容:
String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
答案 14 :(得分:2)
或者,您也可以通过以下方式在其他应用中打开应用中的意图:
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
其中uri
是其他应用的深层链接
答案 15 :(得分:2)
对于API级别3+,只需一行代码:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");
返回CATEGORY_INFO启动Intent(没有启动器活动的应用程序,例如壁纸,经常使用它来提供有关应用程序的一些信息),如果没有找到它,则返回包的CATEGORY_LAUNCH(如果存在)。
答案 16 :(得分:2)
由于不允许应用程序更改许多手机设置,因此您可以像其他应用程序一样打开设置活动。
手动修改设置后,查看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
}
答案 17 :(得分:0)
试试这段代码,希望这会对你有所帮助。如果此软件包可用,则会打开应用程序或打开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)));
}
}
答案 18 :(得分:0)
您可以使用此命令查找设备上安装的软件包名称:
adb shell pm list packages -3 -f
参考:http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/
答案 19 :(得分:-3)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name","package_name.class_name"));
intent.putExtra("grace", "Hi");
startActivity(intent);