0

首先:我在Android编程方面比较大

我使用服务创建了简单的 TCP 套接字。

MainActivity触发按钮时,客户端连接到服务器。

现在我想使用服务对象创建PrintWriter对象。MainActivitySocket

我知道可以使用 JSON 传递Service对象Activity

我在互联网上搜索,但不知道如何通过它。

请给我简单的代码示例来传递对象。

我的服务.java

public class MyService extends Service{
public static Socket clientsocket;
public static PrintWriter printer;
SendMessage sender;

@Override
public void onCreate() {
Toast.makeText(this, "Created", Toast.LENGTH_LONG).show();
super.onCreate();
}

@Override
public void onDestroy() {
Toast.makeText(this, "Stoped", Toast.LENGTH_LONG).show();
if(clientsocket!=null){
        try{
        clientsocket.close(); 
        Toast.makeText(this, "Socket Closed", Toast.LENGTH_LONG).show();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
  }

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Running", Toast.LENGTH_LONG).show();
    SendMessage sender=new SendMessage();
    sender.execute();
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

class SendMessage extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {
        try {
            clientsocket = new Socket("192.168.237.1", 6666);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if(clientsocket!=null){
            Toast.makeText(MyService.this, "Connected", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(MyService.this, "Lost Connection", Toast.LENGTH_LONG).show();
        }
        super.onPostExecute(result);
    }

   }}

MainActivity.java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void start(View v){
    startService(new Intent(this,MyService.class));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     return true;
}

class PrintMessage extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... arg0) {
        return null;
    }
}

@Override
protected void onDestroy() {
    stopService(new Intent(this,MyService.class));
    super.onDestroy();
}}

现在我需要 MyService.java (在这种情况下如何传递对象 Ie Socket对象clientsocket)和 MainActivity.java (如何检索传递的对象 Ieclientsocket并使用它来创建PrintWriter对象) 的清晰完整的代码

4

2 回答 2

0

请考虑使用事件总线库,例如 greenrobot EventBus :-) 这些在应用程序元素之间传递数据时会产生奇迹,并且使用起来非常安全。

于 2014-12-15T09:02:23.767 回答
0

我个人会使用以下解决方案How to send event from Service to Activity with Otto event bus?使用Otto事件总线,只需发送一个包含数据的类的实例。

public class MainActivity extends ActionBarActivity
{

    @Override
    protected void onResume()
    {
        super.onResume();
        SingletonBus.INSTANCE.getBus().register(this);
    }

    @Override
    protected void onPause()
    {
        SingletonBus.INSTANCE.getBus().unregister(this);
        super.onPause();
    }
    ...
}

// you might need to change this as linked in the above link: 
// https://stackoverflow.com/questions/15431768/how-to-send-event-from-service-to-activity-with-otto-event-bus
public enum SingletonBus
{
    INSTANCE;

    private Bus bus;

    private SingletonBus()
    {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public Bus getBus()
    {
        return bus;
    }
}

public class MyEvent
{
    private Data data;

    public MyEvent(Data data)
    {
        this.data = data;
    }

    public Data getData()
    {
        return data;
    }
}

SingletonBus.INSTANCE.getBus().post(new MyEvent(data));
于 2014-12-15T09:17:43.677 回答