【问题标题】:Why is the email Intent not working from Common (non Activity) class为什么普通(非活动)类的电子邮件意图不起作用
【发布时间】:2015-07-01 22:00:49
【问题描述】:

此代码在 Activity 类中完美运行,但如果我将此代码移至 Common(非 Activity)类,我会收到此错误:

从 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?

代码如下:

public static void emailIntend(Context context) {

        Intent emailIntent = new Intent(Intent.ACTION_SENDTO, null);

        emailIntent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.string_email_send_feedback_subject));
        String[] receipients = new String[1];
        receipients[0] = context.getString(R.string.string_email);
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, receipients);

        emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(Intent.createChooser(emailIntent, "Send email to the developer..."));

    }

这就是我从 Activity 调用的方式:

 Common.emailIntend( getApplicationContext() );

我尝试将getApplicationContext() 替换为this,但没有任何帮助。

如果我做的不对,请告诉我。

【问题讨论】:

  • 请解释“这不起作用”是什么意思。另外,AFAIK,您需要 mailto: Uri 而不是 ACTION_SENDTO 上的 EXTRA_EMAIL
  • @CommonsWare 这是我收到Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 的错误,否则 Activity 类中的代码正常。
  • @DanielNugent 是的,已更新。谢谢。

标签: android android-intent


【解决方案1】:

问题是您在错误的 Intent 上调用 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
这与使用getApplicationContext() 相结合,导致错误。

Intent.createChooser() 的调用返回一个新的Intent,这就是需要FLAG_ACTIVITY_NEW_TASK 标志的意图,因为它是您传递给startActivity() 的意图。

请注意,如果我将 Activity 上下文传递给方法(Activity 中的 this),则不需要 FLAG_ACTIVITY_NEW_TASK

另外请注意,我还必须稍微修改您的代码以使选择器正常工作,您的原始代码对我不起作用,即使在 Activity 中也是如此。

以下代码对我有用,即使使用 getApplicationContext() 作为传入的上下文:

public static void sendEmail(Context context){
    String uriText =
            "mailto:test@gmail.com" +
                    "?subject=" + Uri.encode("test subject");
    Uri uri = Uri.parse(uriText);

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);

    Intent i = Intent.createChooser(emailIntent, "Send email to the developer...");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i);
}

参考资料:

ACTION_SENDTO for sending an email

startActivity within a subclass of Application

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多