【问题标题】:Check if Intent calling specific Component is callable?检查 Intent 调用特定组件是否可调用?
【发布时间】:2015-12-26 17:05:29
【问题描述】:

我的意图是打开系统设置应用程序的“数据使用摘要”视图(未记录;from this Stack Overflow answer):

Intent openIntent = new Intent(Intent.ACTION_MAIN);
openIntent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(openIntent);

是否可以检查该组件是否存在以及intent是否会成功执行?

similar question 给出的答案不适用于 Android (5.0) 模拟器中的此意图(导致“设置”应用多次崩溃 - see stacktrace)。下面的代码答案返回 true(即成功),即使我上面的代码会使设置应用程序崩溃。由于没有数据计划集,我的活动意图到目前为止只在可能的模拟器上崩溃(?)

private boolean isCallable(Intent intent) {
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

From this answer..

boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;

From this one..

谢谢。

【问题讨论】:

  • “导致设置应用程序多次崩溃”——请编辑您的问题并提供完整的堆栈跟踪。您链接到的答案是正确的,因此我们需要堆栈跟踪来告知您哪里出错了。
  • @CommonsWare 我已经添加了它,但这里的问题不应该与我正在做的任何特殊事情有关。这是由于“带宽模块”被禁用而仅在模拟器中发生的问题,不应“在野外”发生。我只是想知道是否有任何方法可以检查/捕获它以防万一。 编辑:刚刚修复了 pastebin 格式。

标签: java android android-intent


【解决方案1】:

你尝试的代码sn-ps之所以说组件可用是因为组件可用。当您尝试启动该组件时,它会发生崩溃。这是由于模拟器错误、Android 错误,还是您碰巧启动了一个未记录为由第三方应用程序启动的活动,我不能说。

是否可以检查该组件是否存在

使用您问题中的代码 sn-ps。在这种情况下,组件存在。

是否可以检查... Intent 是否会成功执行?

一般不会。第三方应用程序由第三方编写。它们不仅可能存在错误/限制,而且您无法确定它们是否在您的应用程序中存在。

【讨论】:

  • 谢谢,我想这是一个非常简单的答案 - 有道理。我的意图访问了未记录的内容,因此我希望有更好的方法来了解如果 Google 关闭访问/删除它等,这是否会在未来导致设备上出现问题(崩溃设置)。
  • @SebJachec:“将来如果谷歌关闭访问/删除它等等。” - 如果他们彻底删除它,您问题中的代码将检测到这一点。如果他们让它不被导出(android:exported="false")或需要一些权限,你应该在你的应用程序中得到一个SecurityException...希望由startActivity()调用抛出(我最近没有尝试过)所以你可以抓住它。但是,在这种情况下,这与他们在 TextView 中的拼写错误或被零除错误没有什么不同。组件中的错误使组件崩溃; 调用组件中的错误会使调用者崩溃。
  • 我明白了。谢谢解释
猜你喜欢
  • 2014-11-01
  • 2017-12-20
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2015-06-25
  • 2021-06-26
相关资源
最近更新 更多