Как передать объект обслуживания в MyActivity?

Прежде всего: я лучше разбираюсь в программировании для Android

Я создал простой TCP-сокет, используя Service.

Клиент подключается к серверу, когда срабатывает кнопка в MainActivity.

Теперь я хочу создать объект PrintWriter в MainActivity, используя объект Socket службы.

Я узнал, что можно передавать объекты из Service в Activity с помощью JSON.

Я искал в Интернете, но не мог понять, как я могу передать это.

Пожалуйста, дайте мне простой пример кода для передачи объекта.

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 (как передать объект, т.е. в данном случае Socket объект clientsocket ), так и для MainActivity.java (как получить переданный объект, т.е. clientsocket, и использовать его для создания PrintWriter объекта) < /б>


person Suroor Ahmmad    schedule 15.12.2014    source источник
comment
поскольку это json, вы можете передать намерение с помощью простой дополнительной строки. Кроме того, если вы привязываете действие, вы можете вернуть метод интерфейса «sendData (String)», поэтому все, что клиент может отправить в json   -  person eduyayo    schedule 15.12.2014
comment
Если возможно, можете ли вы дать мне простой код!   -  person Suroor Ahmmad    schedule 15.12.2014
comment
намерения: android-coding. blogspot.com.es/2011/11/   -  person eduyayo    schedule 15.12.2014
comment
связующее: stackoverflow.com/questions /9954878/   -  person eduyayo    schedule 15.12.2014
comment
все виды: vogella.com/tutorials/AndroidBroadcastReceiver/article.html   -  person eduyayo    schedule 15.12.2014
comment
Дай мне попробовать. Так держать   -  person Suroor Ahmmad    schedule 15.12.2014


Ответы (2)


Пожалуйста, рассмотрите возможность использования библиотеки шины событий, такой как greenrobot EventBus :-) Они творят чудеса, когда дело доходит до передачи данных между элементами приложения, и они довольно безопасны в использовании.

person Kelevandos    schedule 15.12.2014
comment
Я хочу передать здесь объект сокета... а не данные. Я хочу использовать его для создания объекта PrintWriter, используя его в Activity - person Suroor Ahmmad; 20.12.2014

Лично я бы использовал следующее решение Как отправить событие из службы в действие с шиной событий Otto? с шиной событий 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));
person EpicPandaForce    schedule 15.12.2014
comment
Это новая концепция для меня... дайте мне изучить ее. Кстати, продолжай качать - person Suroor Ahmmad; 15.12.2014