我有一个小型的Android应用程序,在其中我直接指定我的应用程序并在ApplicationSubclass的onCreate中进行一些应用程序范围的设置,但是我遇到了以下错误(注意,我知道FLAG_ACTIVITY_NEW_TASK):
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ContextImpl.startActivity(ContextImpl.java:644)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
at somePart.ofA.nameSpace.ApplicationSubclass.sendNotificationEmail(ApplicationSubclass.java:186)
我会在一些异常被抛出并被我捕获时调用sendNotificationEmail,以便应用程序的用户可以发送一封简短的电子邮件,其中包含有关异常的信息,以便我更容易地修复任何可能出现的问题或指导他们解决问题。
以下是相关代码:
manifest.xml:
<application android:label="@string/app_name" android:icon="@drawable/icon" android:name=".ApplicationSubclass">
// ... some stuff, including all of my app's activities
</application>
应用程序子类被定义为:
public class ApplicationSubclass extends Application {
// Multiple methods, including an override of onCreate
public void sendNotificationEmail(String emailBody) {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("text/html");
emailIntent.putExtra(Intent.EXTRA_EMAIL, notificationRecipients);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "MyAppName Error");
emailIntent.putExtra(Intent.EXTRA_TEXT, emailBody);
try {
startActivity(Intent.createChooser(emailIntent, "An error has occurred! Send an error report?"));
} catch (ActivityNotFoundException e) {
// If there is nothing that can send a text/html MIME type
e.printStackTrace();
}
}
}
我想知道为什么会发生这种情况。我阅读了一些文档,在StackOverflow和互联网上寻找了一些答案。看起来我应该没问题,因为我设置了FLAG_ACTIVITY_NEW_TASK,但显然并非如此!
难道我不能从Application的上下文中尝试执行此操作吗?我必须在我的应用程序中的Activity中进行尝试吗?需要围绕此重新设计有点烦人,并且能够发送异常电子邮件将非常有用!
编辑:Rich提出了一个很好的问题,那就是我为什么要首先这样做呢?答案很简单,因为正在加载应用程序中可能会失败的数据,当发生这种情况时,我希望用户能够发送其中的某些故障数据。
之所以在Application中而不是Activity中,是因为有一些应用程序状态变量我不想每次旋转设备时都失去它们。当我发现对于Activies,每次旋转时都会调用onPause和onCreate时,我将此代码重构到Application中(效果很好!)。我实际上尝试了将这些内容发送到onConfigurationChanged并在我的activity中覆盖该方法的解决方案,但这很混乱,而且出于某种原因,尽管在我的清单中放置了android:configChanges =“keyboardHidden | orientation”,但它并没有正确地为我工作。我确定我可以追求这个选项,但我宁愿将事情留在原地(更清洁)并获得某人发送电子邮件的能力!