【问题标题】:How to pass Object of Service to MyActivity?如何将服务对象传递给 MyActivity?
【发布时间】:2015-02-13 07:01:54
【问题描述】:

首先:我更擅长Android编程

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

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

现在我想使用Socket 服务对象在MainActivity 中创建PrintWriter 对象。

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

我在 Internet 上进行了搜索,但不知道如何通过它。

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

MyService.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(如何检索传递的对象 Ie clientsocket并用它来创建PrintWriter对象)

【问题讨论】:

标签: java android sockets object android-service-binding


【解决方案1】:

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

【讨论】:

  • 我想在这里将套接字对象传递给活动......而不是数据。我想在 Activity 中使用它来创建 PrintWriter 对象
【解决方案2】:

我个人会使用以下解决方案 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));

【讨论】:

  • 这对我来说是一个新概念……让我研究一下。顺便说一句,继续摇摆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多