我正在尝试创建一个能够完成以下任务的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
更改为静态方法。但是,我在sendPI
内sendQuestion
收到错误,我在静态上下文中无法使用this
。
有没有办法可以获得MainActivity
的上下文或保持sendQuestion
非静态而不与我不改变的任何一个冲突?什么是未来一般避免此类问题的最佳方法?
答案 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
的对象;因此,程序的其余部分需要一种方法来为其提供所需的参考。将它作为构造函数参数提供给它可能是实现这一目标的最简单方法。