рд╕рд░реНрд╡рд┐рд╕ рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреВрдЖрдИ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛

рдЙрджреНрджреЗрд╢реНрдп:
рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ "рд╕реЙрдХреЗрдЯреНрд╕" рдкрд░ рдмрдирд╛рдПрдВ, рддрд╛рдХрд┐ рдЬрдм рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдВрдж рд╣реЛ рдЬрд╛рдП, рддреЛ рдХрд╛рдо рдЬрд╛рд░реА рд░рд╣реЗ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдЦреЛ рди рдЬрд╛рдПред

рд╕рдорд╛рдзрд╛рди:
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдорджрдж рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдПрдХ рд╕реЗрд╡рд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди 3 рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:


MainActivity:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.startService(new Intent(this, ServiceExchange.class)); //   } } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { onDataFromService(intent); } }; public void onResume() { super.onResume(); registerReceiver(broadcastReceiver, new IntentFilter(ServiceExchange.BROADCAST_ACTION)); } @Override public void onPause() { super.onPause(); unregisterReceiver(broadcastReceiver); } public void onDataFromService(Intent intent) { Log.d("onDataFromService", intent.getStringExtra("text")); } 

рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╢реНрд░реЛрддрд╛ "рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрдЗрд╡рд░" рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╕реЗрд╡рд╛ рд╕реЗ рдСрдирдбреЗрдЯрд╛рдлреНрд░реЙрдо рд╕рд░реНрд╡рд┐рд╕ рд╕реЗрд╡рд╛ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред
ServiceExchange.BROADCAST_ACTION рдХреЛ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡реЗ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗред

ServiceExchange:
 public class ServiceExchange extends Service { private Intent intent; public static final String BROADCAST_ACTION = "com.rheit.base.event"; //    @Override public void onCreate() { super.onCreate(); intent = new Intent(BROADCAST_ACTION); createConnect(); } Handler myUpdateHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case config.ERR_SOCKET_SERVER_UNAVAILABLE: //    createConnect(); //  sendBroadcast((Intent) msg.obj); //    UI break; case config.CODE_SOCKET_SERVER_ANSWER: //     //        sendBroadcast((Intent) msg.obj); //    UI break; case config.CODE_SOCKET_SERVER_CONNECTED: //     //        sendBroadcast((Intent) msg.obj); //    UI break; default: break; } super.handleMessage(msg); } }; @Override public IBinder onBind(Intent arg0) { Log.v(this.getClass().getName(), "---> Service binded."); return null; } @Override public void onDestroy() { Toast.makeText(this, "Service destoyed", Toast.LENGTH_LONG).show(); Log.v(this.getClass().getName(), "Service destoyed."); } private void createConnect() { if (ServerTask == null || ServerTask.getStatus().equals(AsyncTask.Status.FINISHED)) { ServerTask = new SocketAsync(myUpdateHandler); ServerTask.execute(); config.SOCKET_MESSAGE = ServerCommands.login("name", "pass"); } } } 

рд╕реЗрд╡рд╛ рд╕реЙрдХреЗрдЯрд╕реЗрдиреНрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рдФрд░ рд╕реЙрдХреЗрдЯрдПрд╕реНрдХреНрдпреВ рд╕реЗ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд░реАрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдирдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреА рд╣реИред

SocketAsync:
 class SocketAsync extends AsyncTask<Void, Integer, Void> { public Socket socket; public String message; public Handler threadHandler; public Context parent; public SocketAsync(Handler threadHandler) { this.threadHandler = threadHandler; } @Override protected Void doInBackground(Void... params) { try { if (config.SOCKET_CONNECTED == false) { InetAddress serverAddr = InetAddress .getByName(config.SERVER_ADDR); socket = new Socket(serverAddr, config.SERVER_PORT); config.SOCKET_CONNECTED = true; Intent intent = new Intent(ServiceExchange.BROADCAST_ACTION); intent.putExtra("SERVER_STATUS", true); Message threadMessage = new Message(); threadMessage.what = com.rheit.config.CODE_SOCKET_SERVER_CONNECTED; threadMessage.obj = intent; threadHandler.sendMessage(threadMessage); } } catch (Exception e) { Intent intent = new Intent(ServiceExchange.BROADCAST_ACTION); intent.putExtra("SERVER_STATUS", false); Message threadMessage = new Message(); threadMessage.what = com.rheit.config.ERR_SOCKET_SERVER_UNAVAILABLE; threadMessage.obj = intent; threadHandler.sendMessage(threadMessage); Log.e(SocketAsync.class.toString(), "ERR_SOCKET_SERVER_UNAVAILABLE doInBackground"); } Thread threadWrite = new Thread(new Runnable() { @Override public void run() { send(socket); } }); threadWrite.start(); //    while (socket != null && socket.isConnected()) { Message m = new Message(); m.what = config.CODE_SOCKET_SERVER_ANSWER; try { BufferedReader input = new BufferedReader( new InputStreamReader(socket.getInputStream())); String st = null; st = input.readLine(); if (st == null) { threadWrite.stop(); socket.close(); socket = null; } else { m.obj = st; myUpdateHandler.sendMessage(m); } } catch (IOException e) { e.printStackTrace(); } } threadWrite.stop(); return null; } protected void send(Socket socket) { while (socket != null && socket.isConnected()) { if (config.SOCKET_MESSAGE != null) { Log.d("Send Message", config.SOCKET_MESSAGE); try { PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); out.println(config.SOCKET_MESSAGE); } catch (Exception e) { Log.e("TCP", "S: Error", e); return; } config.SOCKET_MESSAGE = null; } } } protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (values.length > 0) { Log.d("onProgressUpdate", values[0].toString()); } } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (socket == null || !socket.isConnected()) { config.SOCKET_CONNECTED = false; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } Intent intent = new Intent(ServiceExchange.BROADCAST_ACTION); intent.putExtra("SERVER_STATUS", false); Message threadMessage = new Message(); threadMessage.what = com.rheit.config.ERR_SOCKET_SERVER_UNAVAILABLE; threadMessage.obj = intent; threadHandler.sendMessage(threadMessage); Log.e(SocketAsync.class.toString(), "ERR_SOCKET_SERVER_UNAVAILABLE onPostExecute"); } } Handler myUpdateHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case config.CODE_SOCKET_SERVER_ANSWER: Intent intent = new Intent(ServiceExchange.BROADCAST_ACTION); intent.putExtra("text", "test"); Message threadMessage = new Message(); threadMessage.what = com.rheit.config.CODE_SOCKET_SERVER_ANSWER; threadMessage.obj = intent; threadHandler.sendMessage(threadMessage); break; default: break; } super.handleMessage(msg); } }; } 

рдЬрдм рд╣рдордиреЗ рд╕реЙрдХреЗрдЯрд╕реЗрдиреНрд╕ рдЯрд╛рд╕реНрдХ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛; рдпрджрд┐ рд╣рдо рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпреВрдЖрдИ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ:
 Intent intent = new Intent(ServiceExchange.BROADCAST_ACTION); intent.putExtra("SERVER_STATUS", true); Message threadMessage = new Message(); threadMessage.what = com.rheit.config.CODE_SOCKET_SERVER_CONNECTED; threadMessage.obj = intent; threadHandler.sendMessage(threadMessage); 

рддрдм рдпрд╣ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП myUpdateHandler рдореЗрдВ ServiceExchange рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ UI рдХреЛ sendBroadcast рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ:
 case config.CODE_SOCKET_SERVER_CONNECTED: //     //        sendBroadcast((Intent) msg.obj); //    UI break; 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ MainActivity рдХреЛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { onDataFromService(intent); } }; public void onDataFromService(Intent intent) { Log.d("onDataFromService", intent.getStringExtra("text")); } 


рдЬрдм рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ unregisterReceiver рдлрд╝рдВрдХреНрд╢рди рд╢реНрд░реЛрддрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬрд╝ рдЦреЛ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдмрд╛рд╣рд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рд╕реВрдЪрдирд╛ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдЫ рдкрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

Source: https://habr.com/ru/post/In150742/


All Articles