Android 如何处理ActivityNotFoundException?

Android 如何处理ActivityNotFoundException?,android,android-activity,Android,Android Activity,在我的应用程序中,我需要使用startActivity查看文件的内容,或者使用默认应用程序打开特定文件,但有时android系统可能无法安装所需的应用程序 我的问题是如何处理这个异常。我要干杯,不是FC 有什么建议吗?THX只需将该活动添加到清单文件中即可。 像 <activity android:name=".ActivityName" android:label="@string/app_name"> </activity

在我的应用程序中,我需要使用startActivity查看文件的内容,或者使用默认应用程序打开特定文件,但有时android系统可能无法安装所需的应用程序

我的问题是如何处理这个异常。我要干杯,不是FC


有什么建议吗?THX

只需将该活动添加到清单文件中即可。

<activity android:name=".ActivityName"
                  android:label="@string/app_name">
        </activity>

注意:捕获此ActivityNotFound异常时要小心,但不能将清单文件修改为运行时,这意味着一旦遇到异常,并且如果要在运行时添加此活动标记,则不能。如果要将错误显示为toast,则

try {
    startActivity(intent);

} catch (ActivityNotFoundException e) {
    // TODO: handle exception
    //Show Toast...
}
发生错误的原因是清单文件中未提及该活动

<activity android:name=".yourActivity"
      android:label="@string/app_name">
</activity>

我想你的问题更多:“如何捕获特定异常并防止强制崩溃”。 以下是您在代码中执行此操作的方式:

try {
    // here is your code that can potentially throw the exception and the force crash
} catch (ActivityNotFoundException activityNotFound) {
    Toast.makeText(this, "your error message", Toast.LENGTH_SHORT).show();
    // maybe also log the exception, for future debugging?
}

警告,不要滥用:悄悄地吞下异常是危险的,会使你的应用程序不稳定,并引入奇怪且难以调试的行为。

Android 11更新:

如果您的目标SDK版本为30或更高版本,则由于以下原因,您不应再使用
resolveActivity
。您最好使用公认答案中提到的try/catch解决方案。有关更多信息,请参阅

旧答案:(已弃用)

您可以使用
resolveActivity
方法

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }else {
        Toast.makeText(this,"No suitable app found!",Toast.LENGTH_SHORT).show();
    }

如果您想处理异常,那么可以使用Try/Catch并处理它。为了解决这种类型的异常,您必须将您的活动注册到清单文件中。不需要在注册文件中注册每个活动,但当您使用startActivity时,您必须注册您的活动。好的。。我试过了。它起作用了。看看我编辑过的答案。谢谢..对不起,伙计。。这不是我需要的。我想让系统来决定运行哪个活动。请注意,我认为由于新的包可见性规则,Android 11(当您以SDK 30+为目标时)上的操作现在失败了,但这些是可配置的权限:
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }else {
        Toast.makeText(this,"No suitable app found!",Toast.LENGTH_SHORT).show();
    }