Android MainActivity和BroadcastReceiver

时间:2013-09-14 16:56:15

标签: java android android-activity broadcastreceiver instance

尝试从不同的类到达对象时遇到问题。我在一个Android项目上,我从我的MainActivity类中完成了一个扩展Activity的套接字连接。然后我创建了另一个名为SmsReceiver的类,它扩展了BroadcastReceiver,因此我可以获得发送到我的手机(模拟器)的消息。现在我需要SmsReceiver类来使用MainActivity类中的outputstream对象,但我不知道如何到达它。我无法创建MainActivity的新实例。

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


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

以下是我的课程:

MainActivity:

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;
    }
}

MainInterface:

public interface MainInterface {
    public PrintWriter getOutputStream();
}

SmsReceiver:

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):异常smsReceiverjava.lang.NullPointerException

1 个答案:

答案 0 :(得分:0)

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

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

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