Область действия Android / Java и контекст - PullRequest
1 голос
/ 07 февраля 2012

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

public class ButtonActivity extends Activity {

    Button myButton;
    TextView myLabel;

      @Override
         public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         myButton = (Button)findViewById(R.id.button1);
         myLabel = (TextView)findViewById(R.id.textView1);

         myButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) 
          {     
            myLabel.setText("Fired");       
            SendClass sendy = new SendClass();      
            sendy.onReceive(null, null );       
          }
       });
     }  
   }

Второй класс, который отправляет широковещательное сообщение:

public class SendClass extends BroadcastReceiver {

 private static final int UDP_SERVER_PORT = 2562;
 Context mContext ;
 DatagramSocket mSocket ;
 InetAddress myBcastIP, myLocalIP ;



@Override
public void onReceive(Context context, Intent intent) {                                         

            String msg = "Toast Message" ;
        DatagramSocket ds = null;
        mContext = context;          
        try {
            ds = new DatagramSocket();          

            try { 
                   myBcastIP    = getBroadcastAddress();

                   mSocket      = new DatagramSocket(UDP_SERVER_PORT); 
                   mSocket.setBroadcast(true); 

                 } catch (IOException e) { 

                 }              


                String udpMsg = "hello"; 

                 InetAddress serverAddr = myBcastIP;
            //InetAddress serverAddr = InetAddress.getByName("192.168.1.5");
            DatagramPacket dp;
            dp = new DatagramPacket(udpMsg.getBytes(), udpMsg.length(), serverAddr, UDP_SERVER_PORT);
            ds.send(dp);
        } catch (SocketException e) {
            e.printStackTrace();
        }catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ds != null) {
                ds.close();
            }
        }            

        Toast.makeText(context, msg, Toast.LENGTH_LONG).show();

       }

   /** 
     * Calculate the broadcast IP we need to send the packet along. 
    */ 
  private InetAddress getBroadcastAddress() throws IOException {
  WifiManager mWifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);

  WifiInfo info = mWifi.getConnectionInfo();


  DhcpInfo dhcp = mWifi.getDhcpInfo(); 
  if (dhcp == null) { 

    return null; 
  } 


  int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
  byte[] quads = new byte[4]; 
  for (int k = 0; k < 4; k++) 
    quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);

  return InetAddress.getByAddress(quads);  // The high order byte is quads[0].
   }  

}

Я думаю, что проблема с onReceive(Context context, Intent intent).

Установка значений на NULL в ButtonClass вызывает принудительное закрытие, и я не могу оставить их пустыми.

Установка их с помощью подсказки кода:

sendy.onReceive(getBaseContext() , getIntent());

Означает, что срабатывает действие Toast, FC нет, но широковещательное сообщение никогда не отправляется.

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

используйте getApplicationcontext (), он содержит информацию о всей активности.

0 голосов
/ 07 февраля 2012

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

Добавление

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Чтобы манифест решил это.Благодарю.

0 голосов
/ 07 февраля 2012

Это неправильный способ отправки широковещательного метода или активации широковещательного приемника, вам нужно позвонить:

Intent intent=new Intent(getApplicationContext(),SendClass.class);
sendBroadcast(intent);
0 голосов
/ 07 февраля 2012

getBaeContext получает контекст приложения, а не контекст активности, вместо этого вам нужен контекст активности

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