Socket通讯对于Android跨进程来说有些杀鸡用牛刀的感觉。这也是一种办法,主要用于两个进程间进行数据互通 实时刷新
先上清单文件
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".ServerService"
android:process=":remote" />
<activity
android:name=".ArActivity"
android:process=":remote" />
MainActivity代码实列
package com.example.mysocket;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.IOException;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "DEBUG-WCL: " + MainActivity.class.getSimpleName();
private Socket socket = null; //客戶端Socket
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, ServerService.class);
startService(intent);
SocketUtils.getInstance().startSocket();
findViewById(R.id.tiao).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,ArActivity.class));
}
});
}
@Override
protected void onDestroy() {
if (socket != null) {
try {
socket.shutdownInput();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
super.onDestroy();
}
}
SocketUtil类
package com.example.mysocket;
import android.os.SystemClock;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
public class SocketUtils {
private Socket socket;
private PrintWriter mPrintWriter;
private int i=0;
// 私有构造
private SocketUtils() {
}
private static SocketUtils single = null;
// 双重检查
public static SocketUtils getInstance() {
if (single == null) {
synchronized (SocketUtils.class) {
if (single == null) {
single = new SocketUtils();
}
}
}
return single;
}
public void startSocket(){
new Thread(new Runnable() {
@Override
public void run() {
connectTCPServer();
}
}).start();
setTimer();
}
/**
* 连接TCP服务器
*/
private void connectTCPServer() {
// 不停重试直到连接成功为止
while (socket == null) {
try {
socket = new Socket("localhost", ServerService.PORT);
mPrintWriter = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
Log.e("TAG", "服务器连接成功");
} catch (IOException e) {
SystemClock.sleep(300);
Log.e("TAG", "连接TCP服务失败, 重试...");
}
}
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while (true) {
String msg = br.readLine();
if (msg != null) {
Log.e("TAG","数据:"+msg);
}
}
} catch (IOException e) {
e.printStackTrace();
}
ServerService.close(mPrintWriter);
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void setTimer(){
Timer timer=new Timer();
TimerTask task=new TimerTask() {
@Override
public void run() {
i++;
if(mPrintWriter!=null){
mPrintWriter.println("韩开"+i);
}
}
};
timer.schedule(task,1000,2000);
}
}
Service类
package com.example.mysocket;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP的服务端
* <p/>
* Created by wangchenlong on 16/6/16.
*
* 提供单列 如果断开 自行做操作保活重新链接
*/
public class ServerService extends Service {
private static final String TAG = "DEBUG-WCL: " + ServerService.class.getSimpleName();
private boolean mIsServiceDestroyed = false;
public static final int PORT = 1709;
private Socket client;
@Override
public void onCreate() {
new Thread(new TcpServer()).start();
super.onCreate();
}
@Override
public void onDestroy() {
mIsServiceDestroyed = true;
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MsgBinder();
}
private MessageInterface messageInterface;
public void setMessageInterface(MessageInterface messageInterface) {
this.messageInterface = messageInterface;
}
public void sendMessage(final int i) {
new Thread() {
@Override
public void run() {
try {
// 向客户端发送消息
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())), true);
out.println(i);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
public class MsgBinder extends Binder {
/**
* 获取当前Service的实例
* @return
*/
public ServerService getService(){
return ServerService.this;
}
}
private class TcpServer implements Runnable {
@Override
public void run() {
final ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(PORT);
} catch (IOException e) {
Log.e(TAG, "建立链接失败, 端口:" + PORT);
e.printStackTrace();
return; // 链接建立失败直接返回
}
while (!mIsServiceDestroyed) {
try {
client = serverSocket.accept();
Log.e(TAG, "接收数据");
new Thread() {
@Override
public void run() {
try {
responseClient(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 接收客户端的消息
*
* @param client 客户端
* @throws IOException
*/
private void responseClient(Socket client) throws IOException {
// 接收客户端消息
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
// // 向客户端发送消息
// PrintWriter out = new PrintWriter(new BufferedWriter(
// new OutputStreamWriter(client.getOutputStream())), true);
//
// out.println(0);
while (!mIsServiceDestroyed) {
String str = in.readLine();
Log.e("TAG","----"+str);
if(messageInterface!=null){
messageInterface.getString(str);
}
if (str == null) {
break;
}
}
Log.e(TAG, "客户端退出: ");
// 关闭通信
// close(out);
close(in);
client.close();
}
/**
* 关闭
* @param closeable 关闭
*/
public static void close(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
数据传输接口
package com.example.mysocket;
/**
* 数据更新接口
*/
public interface MessageInterface {
void getString(String msg);
}
子进程Activity类
package com.example.mysocket;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
/**
* 接收端
* 子进程
*/
public class ArActivity extends AppCompatActivity implements MessageInterface{
private TextView ar_tv;
private ServerService service1;
private ServiceConnection serviceConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ar);
ar_tv = findViewById(R.id.ar_tv);
//下载的Service绑定
Intent intent = new Intent(ArActivity.this, ServerService.class);
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
service1 = ((ServerService.MsgBinder) service).getService();
service1.setMessageInterface(ArActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
/**
* 接口回调数据
* @param msg
*/
@Override
public void getString(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
ar_tv.setText(msg);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
}