[英]How to pass Object of Service to MyActivity?
首先:我在Android編程方面做得更好
我已經使用Service創建了簡單的TCP套接字。
觸發MainActivity
的按鈕時,客戶端將連接到服務器。
現在,我想使用Service的Socket
對象在MainActivity
創建PrintWriter
對象。
我知道可以使用JSON將對象從Service
傳遞到Activity
。
我通過互聯網搜索,但不知道該如何通過。
請給我簡單的代碼示例以傳遞對象。
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(如何取回傳遞的對象ie clientsocket
並使用它來創建PrintWriter
對象)的代碼都清晰而完整
請考慮使用事件總線庫,例如greenrobot EventBus :-)當涉及到在應用程序的各個元素之間傳遞數據時,這些工作很奇怪,並且使用起來非常安全。
我個人將使用以下解決方案如何使用Otto事件總線將事件從服務發送到活動? 使用Otto Event Bus,並僅發送包含數據的類的實例。
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.