2013-09-14 17 views
0

У меня проблема при попытке достичь объектов из разных классов. Я нахожусь в проекте Android, и я сделал сокет из моего класса MainActivity, который расширяет Activity. Затем я создал еще один класс под названием SmsReceiver, который расширяет BroadcastReceiver, поэтому я могу получать сообщения, отправленные на мой телефон (эмулятор). Теперь мне нужен класс SmsReceiver для использования объекта outputstream из класса MainActivity, но я не знаю, как его достичь. Я не могу создать новый экземпляр MainActivity.Android MainActivity и BroadcastReceiver

Могу ли я каким-либо образом отправить выходной объект в класс 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, что я получаю через интерфейс нуль и InputStream на рабочем столе (это программа, которая должна получить сообщение при выполнении out.println()) не даже получить сообщение, он просто заблокирован на in.readLine(). Я создаю интерфейс неправильно или что происходит?

Отпечаток ошибка LogCat является: 09-15 14: 13: 55,880: E/SmsReceiver (1361): Исключение smsReceiverjava.lang.NullPointerException

+0

Как правило, вы создаете экземпляр и регистрируете свой широковещательный приемник в своей деятельности. –

+0

Вы имеете в виду, что не создаете отдельный класс для трансляции? – user2099024

+0

вы можете, но инстанцировать его в Activity, например. MyBroadcastReceiver mReceiver = новый MyBroadcastReceiver(); –

ответ

0

Вы должны быть установка намерение к классу BroadcastReceiver в вашем MainActivity, почему вы не отправляете данные с использованием этого BroadcastReceiver, это будет намного проще, чем тот подход, который я задал раньше, прежде чем увидеть ваш код.

Данные, которые вы получите в приемнике вещания, пожалуйста, проверьте, работает ли это решение. Но вам нужно поработать над тем, как отправить объект PrintWriter с помощью намерения.

Другим решением может быть использование шаблона наблюдателя и подписчика, вы можете найти несколько примеров в сети для них.

+0

Мне кажется, он нуждается в широковещательном приемнике для отправки данных через выходной поток ... и как бы вещательный приемник получает экземпляр активности? Я не думаю, что это хорошее решение. –

+0

@ Su-AuHwang На самом деле мне действительно не нужен экземпляр активности, мне просто нужен выходной поток. Это может сработать, я постараюсь завтра, когда я нахожусь на своем компьютере! – user2099024

+0

@ Su-AuHwang - здесь требование предназначено только для объекта выходного потока, экземпляр основной активности необходим для доступа к выходному объекту, когда решение идет без доступа к объекту, это решение отлично работает. :) –

Смежные вопросы