2013-02-20 27 views
15

İlk önce sunucuma veri gönderen etkinliğimde bir zamanuyumsuz görev gerçekleştirdim. Ancak aktiviteleri değiştirdiğimde bağlantı kayboldu. Bu yaklaşımım önlemek için ağ operasyonu merkezileştirmektedir ve sunucuya veri gönderir ve bu hizmet için kod Rotator.java bu hizmetine bağlama benim faaliyettirAndroid istemcisi, etkinlik değişikliklerinde bile sunucuya bağlı kalsın ve verileri sunucuya nasıl iletir?

import java.io.BufferedWriter; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class SocketService extends Service { 
    public static final String SERVERIP = ""; //your computer IP address should be written here 
    public static final int SERVERPORT = 5000; 
    PrintWriter out; 
    Socket socket; 
    InetAddress serverAddr; 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    System.out.println("I am in Ibinder onBind method"); 
     return myBinder; 
} 

    private final IBinder myBinder = new LocalBinder(); 
    TCPClient mTcpClient = new TCPClient(); 

    public class LocalBinder extends Binder { 
     public SocketService getService() { 
      System.out.println("I am in Localbinder "); 
      return SocketService.this; 

     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     System.out.println("I am in on create");  
    } 

    public void IsBoundable(){ 
     Toast.makeText(this,"I bind like butter", Toast.LENGTH_LONG).show(); 
    } 

    public void sendMessage(String message){ 
     if (out != null && !out.checkError()) { 
      System.out.println("in sendMessage"+message); 
      out.println(message); 
      out.flush(); 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent,int flags, int startId){ 
     super.onStartCommand(intent, flags, startId); 
     System.out.println("I am in on start"); 
     // Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show(); 
     Runnable connect = new connectSocket(); 
     new Thread(connect).start(); 
     return START_STICKY; 
    } 


    class connectSocket implements Runnable { 

     @Override 
     public void run() { 


      try { 
       //here you must put your computer's IP address. 
       serverAddr = InetAddress.getByName(SERVERIP); 
       Log.e("TCP Client", "C: Connecting..."); 
       //create a socket to make the connection with the server 

       socket = new Socket(serverAddr, SERVERPORT); 

       try { 


        //send the message to the server 
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 


        Log.e("TCP Client", "C: Sent."); 

        Log.e("TCP Client", "C: Done."); 


        } 
       catch (Exception e) { 

        Log.e("TCP", "S: Error", e); 

       } 
      } catch (Exception e) { 

       Log.e("TCP", "C: Error", e); 

      } 

     } 

    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
      try { 
       socket.close(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      socket = null; 
     } 


    } 

aşağıda verilmiştir bir hizmeti uygulamaktı. Aşağıda, aktivitemden birkaç parça kod var. ben bir hizmeti Activity bağlı olduğunda

if(mBoundService!=null) 
{ 
    mBoundService.sendMessage("right"); 
} 

cevap

5

Kod doğru. Tek hata, onServiceConnected() yönteminde ve diğerinde onCreate() yönteminde hizmeti iki kez başlatmaya çalışmaktı.

Kodumu, başlatıcı aktivitesinde yalnızca onCreate() yönteminde başlatmak için değiştirdim. Etkinliklerin geri kalanı doBindService() yöntemi

+0

aktivitesi değiştiğinde öldürülmüyor. – BSKANIA

+0

Yukarıdaki kodunuz mükemmel mi yoksa kodun üstünde iki kez hizmete mi başladık? kodun üstünde mi değiştin? Ben bir kez startervice yöntemi kullanarak ve doBindservice yöntemini kullanarak bir kez başladığını görebilirsiniz. Lütfen doğru olun. Ben bu –

+0

@sam_k okuduktan sonra bir connfuse Ben startService yöntemi sadece hizmeti başlatan ana aktivitede kullandım. Etkinliklerin geri kalanı onCreate'da doBindService() yöntemini kullanır. Yukarıdaki kod, doğru kodla düzenlenmiştir. Ben senin karışıklığını anlamıyorum – Giz

2

aşağıdaki i kullanmak sunucuya bazı verileri göndermek istiyorsanız

private ServiceConnection mConnection = new ServiceConnection() { 
      //EDITED PART 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     // TODO Auto-generated method stub 
     mBoundService = ((SocketService.LocalBinder)service).getService(); 

    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     // TODO Auto-generated method stub 
     mBoundService = null; 
    } 

    }; 


    private void doBindService() { 
     bindService(new Intent(Rotator.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE); 
     mIsBound = true; 
     if(mBoundService!=null){ 
     mBoundService.IsBoundable(); 
     } 
    } 


    private void doUnbindService() { 
     if (mIsBound) { 
      // Detach our existing connection. 
      unbindService(mConnection); 
      mIsBound = false; 
     } 
    } 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 
     gestureDetector = new GestureDetector(this, new GestureListener()); 
     setContentView(R.layout.activity_rotator); 


     //Binding the activity to the service to perform client-server operations 
     //start service on create 
     startService(new Intent(Rotator.this,SocketService.class)); 
     doBindService(); 
        ........... 
        ........... 
} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    doUnbindService(); 
} 

Şimdi bu hizmeti öldürülüyor, arka planda çalışır olarak ne zaman Faaliyet durduruldu, sadece Activity için bir arka plan hizmeti gibi. Bu nedenle, çalışmasını sürdürmek için onStartCommand() yöntemini Service sınıfında uygulayın ve this.START_STICKY'u döndürün. ve bu yöntemde hizmetinizi yönetin.

+0

'u kullanarak doğrudan hizmete bağlanır. Bunu hizmet kodumda yapmıştım. Ama verileri sunucuya göndermek için async görevine nasıl gönderileceğini bilmiyorum. – Giz

+0

mTcpClient etkinliğinde her zaman boştur. – Giz

+0

Hayır, bir 'Binder' kullanarak' Activity''a bağlanıyorsanız, bir 'Service''in android belgelerini kontrol edin, sonra otomatik olarak kapanır. 'Binder' den kaldırmayı deneyin ve bunun yerine onStartCommand() 'da deneyin. Sana söylüyorum budur. – AbdulHannan