0

尝试访问不同类的对象时遇到问题。我在一个android项目上,我从我的MainActivity类中完成了一个socketconnection,它扩展了Activity。然后我创建了另一个名为 SmsReceiver 的类,它扩展了 BroadcastReceiver,这样我就可以获取发送到我的手机(模拟器)的消息。现在我需要 SmsReceiver 类来使用 MainActivity 类中的输出流对象,但我不知道如何访问它。我无法创建 MainActivity 的新实例。

我可以以某种方式将输出流对象发送到 SmsReceiver 类吗?我希望你们中的一些人得到一些提示,提前谢谢!


好的,现在我已经选择了接口解决方案,但我又被卡住了!

这是我的课程:

主要活动:

public class MainActivity extends Activity implements MainInterface
{

try {
                            out = new PrintWriter(clientSocket.getOutputStream());
                            in = new BufferedReader(new                                InputStreamReader(clientSocket.getInputStream()));
                        } catch (IOException ex) {
                            System.err.println("Error in creating Streams:" +   ex.toString());
                            return;
                        }

public PrintWriter getOutputStream() {
        return out;
    }
}

主界面:

public interface MainInterface {
    public PrintWriter getOutputStream();
}

短信接收者:

public class SmsReceiver extends BroadcastReceiver{

    MainInterface mainInterface = new MainActivity();  ///// <------
    PrintWriter out;  //// <--------

    @Override
    public void onReceive(Context context, Intent intent) {
        mainInterface.getOutputStream(); ////// <------------
        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {
            if(bundle != null){

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for(int i = 0; i < pdusObj.length; i++){
                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    String senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();

                    Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
                    out.println("senderNum: "+ senderNum + "; message: " + message);
                    out.flush(); /// these two lines
                }
              }
        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);
        }
    }

}

由于某种原因,我通过接口获得的 PrintWriter 是null,桌面上的输入流(这是在执行out.println()时应该接收消息的程序)甚至没有收到消息,它只是被阻止了in.readLine()。我是在以错误的方式实例化接口还是发生了什么?

logcat 错误打印是: 09-15 14:13:55.880: E/SmsReceiver(1361): Exception smsReceiverjava.lang.NullPointerException

4

1 回答 1

0

您必须在 MainActivity 中为 BroadcastReceiver 类设置一个意图,为什么不使用此 BroadcastReceiver 的意图发送数据,这比我之前在查看您的代码之前提出的方法要容易得多。

您将在广播接收器的意图中收到的数据,请检查此解决方案是否有效。但是,您需要找到一种通过意图发送 PrintWriter 对象的方法。

另一种解决方案是使用观察者和订阅者模式,您可以在网上找到多个相同的示例。

于 2013-09-14T17:04:22.973 回答