【问题标题】:Start ACTION_SEND Intent from Library从库中启动 ACTION_SEND Intent
【发布时间】:2015-05-19 10:42:06
【问题描述】:

我想启动一个与客户发送电子邮件的意图。但是context.startActivity 在图书馆项目中不起作用。你能帮助我吗?谢谢

public class email {
private Context context;

public email(Context context) {
    this.context = context;
}

public void send(String to, String subject, String body) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("message/rfc822");
    intent.putExtra(Intent.EXTRA_EMAIL, to);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_TEXT, body);

    try {
        context.startActivity(Intent.createChooser(intent, "sending..."));
    }
    catch (ActivityNotFoundException e) {

    }
}

好的。 Logcat 说:

java.lang.RuntimeException:无法启动 Activity ComponentInfo{com.example.test.MainActivity}:android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?

【问题讨论】:

  • 请添加更多信息,例如您的代码,以及您收到的哪些错误消息导致您认为它“不起作用”。
  • 好的,也许 ActivityNotFound 符合您的意图。完美。
  • 在主要活动中有效,但在库中无效。
  • "但是 context.startActivity 在库项目中不起作用" -- 是的,如果context 是有效的Context,它会起作用。但是,您没有费心解释“不起作用”是什么意思。如果您收到ActivityNotFoundException,则无需费心将任何内容记录到 LogCat。您没有费心向我们展示您是如何尝试使用这个email Java 类的。这不是a minimal, complete, verifiable example,所以任何人都很难帮助你。

标签: android android-intent android-library


【解决方案1】:

我通常使用

getActivity().getBaseContext()

在大多数情况下,但如果您遇到困难,还有另一种方法。

您可以定义一个抽象的基本活动,然后让您的所有活动实现它,或者至少是您需要在它的子项中引用上下文的活动。

`公共抽象类BaseActivity扩展Activity ... 私有静态上下文baseContext; ...

@Override
public void onCreate() {
    super.onCreate();

    BaseApplication.baseContext = getApplicationContext();

...

public static Context getMyContext() {
    return BaseApplication.baseContext;
}

`

然后您可以在其他地方更轻松地调用 getMyContext(),但只有在 getActivity().getBaseContext() 不起作用时才使用它。

我需要有关您的代码的更多细节,例如它被调用的活动类型等,才能给出准确的答案。

【讨论】:

    【解决方案2】:

    我自己找到了解决方案: 当我想将context 传递给email 类的构造函数时,我使用了getApplicationContext(),当我将其更改为this 时,它起作用了。

    【讨论】:

    • 很高兴您自己找到了解决方法。但是你的解决方案不好。我猜你是从一个活动中使用这个类。因此,使用作为 ActivityContext 的“this”而不是“getApplicationContext()”已经解决了这个问题。但是您的构造函数实际上正在获取 Context 引用。因此,其他任何人都可以使用 ApplicationContext 创建它的对象,并且您的代码将允许他创建它。稍后他们在调用 send() 时会得到异常。因此,在意图中添加一个标志而不是严格依赖 ActivityContext 是一个更好的主意。
    • 假设如果你从广播接收器使用这个方法,那么它会抛出同样的异常。
    • 当我添加你说的标志时,Logcat 说: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a空对象引用
    【解决方案3】:

    在开始活动之前添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);。每当您尝试切换到 Activity 但您的起点不是 Activity 本身时,您都需要设置此标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2011-08-31
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多