2

我想要做的是将 mainactivity 的引用传递给另一个类并使用它。

当我第一次传递引用时,它不为空。但后来当我在事件处理程序中使用它时,它变为空。

这是代码:

public class MainActivity extends MapActivity implements SmsReceivedListener {
    SmsReceiver smsreceiver = new SmsReceiver();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsreceiver.setSmsReceivedListener(this);
    }

    public void drawme() {
        // do smth
    }

    @Override
    public void onSmsReceived(String id, String lon, String lat) {
        Toast.makeText(this, "SMS delivered", Toast.LENGTH_LONG).show();

    }
}

我获得参考的另一个类:

public class SmsReceiver extends BroadcastReceiver {
    private SmsReceivedListener listener;
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    @SuppressLint("NewApi") 
    @Override
    public void onReceive(final Context context, final Intent intent) {
        // Here it is NULL
        if(listener!=null)
            listener().onSmsReceived(carNumber, lon,lat);
    }

    public void setSmsReceivedListener(SmsReceivedListener mainActivity) {
        //It is no null when I first set the object here
        listener = (mainActivity);
    }
}
4

2 回答 2

1

它只会“变成” null 如果你

  • 将其设置为空
  • 以非线程安全的方式使用它,并且您正在阅读不同的线程来设置
  • 您正在使用相同的字段,但在不同的对象中。
于 2013-01-18T10:26:55.057 回答
1

您没有注册 SmsReceiver,因此我猜如下:

SmsReceiver 在 Manifest 中注册。因此,当检测到广播时,系统会创建一个接收器的实例,它与您创建的实例不是同一个实例。

建议:在活动中注册接收者,而不是在清单中。

于 2013-01-18T10:38:41.403 回答