无法制作静态参考/不能使用"这个"在静态背景下的困境

时间:2014-03-24 17:16:24

标签: java android static scope android-context

我正在尝试创建一个能够完成以下任务的Android应用程序:它通过短信向一组收件人(存储在数组中的数字)发送初步调查问题。然后,对于它获得的每个响应,它向该参与者发送该系列中的下一个问题。这是我做过的第一个Android开发,所以如果这很明显我很抱歉!

我在MainActivity中定义了sendQuestion函数:

public void sendQuestion(String number, int question)
{
    //necessary setup for sending a text message
    SmsManager sms = SmsManager.getDefault();
    PendingIntent sentPI;
    String SENT = "SMS_SENT";
    sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);

    //actually sends the text message
    sms.sendTextMessage(number, null, questions[question], sentPI, null);
}

然后我试图从我的SmsReceiver类中调用sendQuestion函数:

public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        for (int i=0;i<MainActivity.numbers.length;i++)
        {
            MainActivity.sendQuestion(MainActivity.numbers[i], MainActivity.survey_location[i]);
        }
    }
}

我得到的第一个错误是我无法对类型为sendQuestion的非静态方法MainActivity进行静态引用。作为修复,我想我会尝试将sendQuestion更改为静态方法。但是,我在sendPIsendQuestion收到错误,我在静态上下文中无法使用this

有没有办法可以获得MainActivity的上下文或保持sendQuestion非静态而不与我不改变的任何一个冲突?什么是未来一般避免此类问题的最佳方法?

2 个答案:

答案 0 :(得分:1)

推荐的方法是在不同的类中使用sendQuestion static等实用程序方法,并将上下文作为参数发送给方法。通过这种方式,您可以从任何位置访问此方法,您只需将上下文作为附加参数传递给方法。

答案 1 :(得分:0)

我看不到你构建SmsReceiver的位置。如果您从MainActivity中的某处执行此操作,则可以向构造函数添加MainActivity参数:

public class SmsReceiver extends BroadcastReceiver {

    private MainActivity mActivity;

    public SmsReceiver(MainActivity activity) {
        super();
        mActivity = activity;
    }

并在MainActivity中,当您创建新的SmsReceiver时,它可能类似于

recv = new SmsReceiver(this);

然后,您将调用MainActivity.sendQuestion而不是mActivity.sendQuestion。我对你的程序知之甚少,所以细节可能有所不同。但最重要的是,您的SmsReceiver需要引用MainActivity 对象,以便知道要调用sendQuestion的对象;因此,程序的其余部分需要一种方法来为其提供所需的参考。将它作为构造函数参数提供给它可能是实现这一目标的最简单方法。