Application子类中的startActivity

时间:2011-10-12 20:38:51

标签: android-activity android

我有一个小的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>

ApplicationSubclass定义为:

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和整个Internet上寻找了一些答案。在我看来,我应该没事,因为我设置了FLAG_ACTIVITY_NEW_TASK,但事实显然并非如此!

是否只是因为我甚至无法尝试从应用程序的上下文中执行此操作?当我尝试这个时,我必须在我的应用程序的活动中吗?需要对此进行重新设计会很烦人,能够发送异常电子邮件会非常有用!

编辑:Rich提出了一个很好的问题,这就是为什么我想首先要这样做?答案很简单,应用程序中加载的数据可能会失败,我希望用户能够在发生这种情况时发送一些失败数据。

这是在应用程序而不是活动中的原因是有应用程序状态变量我不想在每次有人旋转设备时丢失。当我发现旋转时调用onPause和onCreate这一事实时(对于Activies)我将这个代码重构为Application(这很好用!)。我实际上已经尝试过将这些方法发送到onConfigurationChanged并在我的活动中覆盖该方法,但这很麻烦,无论出于何种原因,尽管在我的清单中放置了android:configChanges="keyboardHidden|orientation"但它并没有正确地为我工作。我确定我可以追求这个选项,但我宁愿保留原样(它更清洁)让某人能够发送电子邮件!< / p>

2 个答案:

答案 0 :(得分:17)

啊!我弄清楚我做了什么,这很简单!我错误地设置了FLAG_ACTIVITY_NEW_TASK!愚蠢的我,我错过了Intent.createChooser(...,...)将返回一个新的Intent,所以你必须在选择器 Intent而不是ACTION_SEND Intent上设置标志。

当你想到这一点时,并不是那么令人困惑,我无法相信我忽视了这一点!

所以,如果有人做过我做过的事,那你就去吧:

public void sendNotificationEmail(String emailBody) {
        Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setType("text/html");
        emailIntent.putExtra(Intent.EXTRA_EMAIL, notificationRecipients);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "MyAppName Error");
        emailIntent.putExtra(Intent.EXTRA_TEXT, emailBody);
        Intent emailChooser = Intent.createChooser(emailIntent, "An error has occurred! Send an error report?");
        emailChooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(emailChooser);
        } catch (ActivityNotFoundException e) {
            // If there is nothing that can send a text/html MIME type
            e.printStackTrace();
        }
    }

答案 1 :(得分:6)

我从我的类中启动了一个活动(在丢失会话时重新登录用户),该类是Application的子类,如下所示:

public boolean relogin(Activity act) {      
    Intent intent = new Intent(act,ActivityLogin.class);    
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);     
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent);              
    act.finish();// here i finish my current activity
}