Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:对另一个类中活动对象的引用变为NULL_Java_Android_Android Intent - Fatal编程技术网

Java Android:对另一个类中活动对象的引用变为NULL

Java Android:对另一个类中活动对象的引用变为NULL,java,android,android-intent,Java,Android,Android Intent,我试图做的是将对mainactivity的引用传递给另一个类并使用它 当我第一次传递引用时,它不是null。但后来,当我在事件处理程序中使用它时,它变为null 代码如下: public class MainActivity extends MapActivity implements SmsReceivedListener { SmsReceiver smsreceiver = new SmsReceiver(); /** Called when the activity i

我试图做的是将对mainactivity的引用传递给另一个类并使用它

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

代码如下:

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);
    }
}
只有当您

  • 将其设置为null
  • 以一种非线程安全的方式使用它,并且您正在读取与设置不同的线程
  • 您使用的是相同的字段,但在不同的对象中

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

SmsReceiver已在清单中注册。因此,当检测到广播时,系统将创建接收器的实例,而该实例与您创建的实例不同


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

如何注册sms接收者?此代码甚至无法编译!您省略了类代码的基本部分,因此我们只能猜测。使用引用的原因是什么??如果您在自己的构造函数中注册SMSReceiver,它将在设置侦听器之前很久注册。是的,我在清单中注册了它。所以你的意思是我应该做以下事情:SmsReceiver SmsReceiver=新的SmsReceiver;IntentFilter=newintentfilter(“android.provider.Telephony.SMS_RECEIVED”);寄存器接收器(SMS接收器、过滤器);为了进一步阐述这个答案,在大多数情况下,您不希望将活动的特定实例绑定到广播接收器。正确的方法是,只允许BroadcastReceiver在活动打开时工作。不正确的方式可能会使它仍然工作,但您可能会面临内存泄漏和看似随机的异常的风险。如果您希望BroadcastReceiver始终处于活动状态,就像您在清单中注册它时一样。您应该继续在清单中注册它。但是处理您的活动需要通过另一个专门用于从SMSReceiver到您的活动进行通信的广播接收器来完成。我会广播一个新的意图,声明您刚刚收到一条新的短信,如果没有任何内容捕捉到该状态意图,您可以启动活动将其带到前台。如果您能让我们更好地了解正在发生的事情,我们可能会更好地告诉您哪种方法更适合。@Mikedge:关于评论的最后一部分,可以使用由BR启动的单任务活动来实现,该活动将启动或接收onNewIntent。@njzk2 google point。如果我们对用例有更多的了解,那么帮助他实现正确的实现就会容易得多。