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

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

我需要知道如何创建一个意图来打开 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)
253159 次浏览

首先,Android 中的“应用程序”概念稍微有些扩展。

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

因此,您必须确定的是如何“启动应用程序”。

好吧... 这是你可以尝试的:

  1. 使用 action=MAINcategory=LAUNCHER创建意图
  2. 使用 context.getPackageManager从当前上下文获取 PackageManager
  3. 其中意图有 category=LAUNCHERaction=MAINpackageManager.resolveActivity(<intent>, 0)获得主/启动器的第一个活动
  4. 去拿你感兴趣的 ActivityInfo
  5. ActivityInfo得到 packageNamename
  6. 最后,使用 category=LAUNCHERaction=MAINcomponentName = new ComponentName(packageName, name)setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)创建另一个意图
  7. 最后,context.startActivity(newIntent)
    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);

我有这样的工作,

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

这是我基于 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();
}
}

如果你已经有了你想要激活的软件包名称,你可以使用下面的代码,这是一个比较通用的:

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

我发现,对于那些主要活动不是通过启动 MAIN 活动的常规方法找到的情况,它的工作效果更好。

由于应用程序不允许更改许多手机设置,所以您可以像其他应用程序一样打开设置活动。

看看在手动修改设置之后 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
}
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name","package_name.class_name"));
intent.putExtra("grace", "Hi");
startActivity(intent);

通过使用 invs 中的解决方案,我使用一个函数扩展了代码片段,当目前没有安装所需的应用程序时,将调用该函数。它的工作原理是: 运行应用程序的软件包名称。如果没有找到,打开 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");

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

意图 = context.getPackageManager () . getLaunchInentForPackage (“ name.of.package”) ;

返回一个 CATEGORY _ INFO 启动意图(没有启动活动的应用程序,例如壁纸,经常使用这个来提供一些关于应用程序的信息) ,如果没有找到它,返回包的 CATEGORY _ LAUNCH,如果存在的话。

用这个:

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

如果您试图启动一个服务而不是活动,这对我很有效:

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

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

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

//这个工作在 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;
}

从我的应用程序活动开始另一个应用程序活动。

下面的代码将工作,如果另一个应用程序已经安装在您的手机上,否则它是不可能的重定向形式一个应用程序到另一个应用程序。因此,请确保您的应用程序启动或不

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

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

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

试试这个代码,希望对你有帮助。如果这个包是可用的,然后这将打开应用程序或打开播放商店下载

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

如果您想打开另一个应用程序,但它没有安装,您可以将其发送到谷歌应用程序商店下载

  1. 例如,首先创建 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.- Usage

openOtherApp(getApplicationContext(), "com.packageappname");

可以使用此命令查找安装在设备上的包名称:

adb shell pm list packages -3 -f

参考资料: http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/