在 Android Studio 中调试,Intent 仅在我之后有断点时运行
Debugging in Android Studio, Intent only runs if I have a breakpoint after
这很奇怪 - 我正在尝试以编程方式打开另一个应用程序。
我发现了这个 link 并遵循了它:Whosebug link
所以我的代码如下 - 注意它在对话框中 运行。
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_HOME);
intentToResolve.setPackage("com.android.launcher3");
intentToResolve.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
ResolveInfo ri = getPackageManager().resolveActivity(intentToResolve, 0);
if (ri != null)
{
Intent intent = new Intent(intentToResolve);
intent.setClassName(ri.activityInfo.applicationInfo.packageName, ri.activityInfo.name);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
这似乎只 "close" 我的应用程序,如果我在代码中放置断点则转到主屏幕。如果我只是让它 运行 没有断点那么什么也不会发生。
我不知道为什么会这样?有任何想法吗?
谢谢
编辑:我已经将它发生的视频上传到 YouTube,这样你就可以明白我的意思了。
你会看到我第一次 运行 它,它到达断点并且设备进入主屏幕。
第二次我 运行 我已经删除了断点并且没有任何反应。
YouTube link
首先要确保您拥有属于 ri.activityInfo.applicationInfo.packageName
packagename 的应用程序。代码看起来不错,问题是包名和你在里面给的 class setClassName()
如果您设置断点它会起作用,这一事实似乎表明存在某种计时问题。
你提到你 运行 这段代码来自一个对话框,对我来说,这强化了你有时间问题的想法。
在对话框关闭后尝试 运行从 Activity 中输入此代码。
如果这不能解决问题,我会感到非常惊讶。
我假设您正在使用对话框让用户选择要启动的内容。
因此,不要尝试从对话框启动其他应用程序,而是将该信息传达给它的父级 activity,并在对话框关闭后让 Activity 运行 此代码。
当您显示对话框时,您是从 Activity 这样做的 - 对话框显示在您的 activity 之上。
您可能正在使用 Dialog Builder 来构建对话框,然后调用 builder.create() 来显示对话框。
在生成器代码中,您可能会执行以下操作:
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User clicked OK
}
})
在 onClick 处理程序中,第二个参数是被单击的项目的 ID。使用此信息来决定您要启动什么。我建议在 Activity 中使用一个单独的方法来执行启动,然后从 onClick 处理程序中调用它。
这很奇怪 - 我正在尝试以编程方式打开另一个应用程序。 我发现了这个 link 并遵循了它:Whosebug link
所以我的代码如下 - 注意它在对话框中 运行。
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_HOME);
intentToResolve.setPackage("com.android.launcher3");
intentToResolve.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
ResolveInfo ri = getPackageManager().resolveActivity(intentToResolve, 0);
if (ri != null)
{
Intent intent = new Intent(intentToResolve);
intent.setClassName(ri.activityInfo.applicationInfo.packageName, ri.activityInfo.name);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
这似乎只 "close" 我的应用程序,如果我在代码中放置断点则转到主屏幕。如果我只是让它 运行 没有断点那么什么也不会发生。
我不知道为什么会这样?有任何想法吗? 谢谢
编辑:我已经将它发生的视频上传到 YouTube,这样你就可以明白我的意思了。 你会看到我第一次 运行 它,它到达断点并且设备进入主屏幕。 第二次我 运行 我已经删除了断点并且没有任何反应。 YouTube link
首先要确保您拥有属于 ri.activityInfo.applicationInfo.packageName
packagename 的应用程序。代码看起来不错,问题是包名和你在里面给的 class setClassName()
如果您设置断点它会起作用,这一事实似乎表明存在某种计时问题。
你提到你 运行 这段代码来自一个对话框,对我来说,这强化了你有时间问题的想法。
在对话框关闭后尝试 运行从 Activity 中输入此代码。 如果这不能解决问题,我会感到非常惊讶。
我假设您正在使用对话框让用户选择要启动的内容。 因此,不要尝试从对话框启动其他应用程序,而是将该信息传达给它的父级 activity,并在对话框关闭后让 Activity 运行 此代码。
当您显示对话框时,您是从 Activity 这样做的 - 对话框显示在您的 activity 之上。
您可能正在使用 Dialog Builder 来构建对话框,然后调用 builder.create() 来显示对话框。
在生成器代码中,您可能会执行以下操作:
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User clicked OK
}
})
在 onClick 处理程序中,第二个参数是被单击的项目的 ID。使用此信息来决定您要启动什么。我建议在 Activity 中使用一个单独的方法来执行启动,然后从 onClick 处理程序中调用它。