这段代码在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..."));

    }


这是我从活动中致电的方式:

 Common.emailIntend( getApplicationContext() );


我尝试用getApplicationContext()替换this,但是没有帮助。

请告诉我我是否做错了什么。

最佳答案

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

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

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

还要注意,我还必须对您的代码进行一些修改才能使选择器正常工作,即使在活动中,您的原始代码也不适合我。

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

public static void sendEmail(Context context){
    String uriText =
            "mailto:[email protected]" +
                    "?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

10-01 02:57