我想在Android studio中使用editText输入服务器的IP地址和端口。按下“连接”按钮时,应保存输入的信息并可供其他活动访问。我已经使用SharedPreferences方法来保存所获取的数据,以便跨活动访问(这是最好的方法吗?)。通过(!client.isClosed())在Connect活动(下面附件)中检查是否成功创建了客户端套接字(在服务中处理)。
我的问题是,只要活动到达Connect.java活动中的检查,isclosed就会无效。我假设客户端Socket因此在服务中创建并在Connect.java活动中调用时被销毁。
有没有办法创建Socket并使其保持活动以供各种其他活动使用 - 我要求套接字保持活动以接收/发送消息到服务器,这将确定应该转换应用程序的活动。在每个活动中创建和关闭套接字的方法都不起作用,因为它将在服务器端注册为新用户 - 我无法访问的模块上的固件。
非常感谢任何示例/文档/帮助。
我是Android App开发和Java的新手,所以如果我的问题很愚蠢,请保持温和: - )
非常感谢您的帮助。
这是处理套接字创建的服务。
import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.StrictMode;
import android.util.Log;
import java.io.IOException;
import java.net.Socket;
public class SocketService extends IntentService
{
public Socket client;
public String ClientIP;
public Integer ClientPORT=0;
public SocketService()
{
super("SocketService");
}
@Override
protected void onHandleIntent(Intent Socketintent)
{
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SharedPreferences savednotes= getSharedPreferences("Socket_NAME",
Context.MODE_MULTI_PROCESS);
ClientIP=savednotes.getString("IP_NAME",null); // Get the IP address
ClientPORT=savednotes.getInt("PORT_NAME",0); // Get the Port number
try
{
Log.d("IP", "Master IP address:" + ClientIP); // Debug to see
variables in Shared preferences
Log.d("PORT", "Port number: " + ClientPORT); // Debug to see
variables in Shared preferences
if ((ClientIP) != null)
{
if ((ClientPORT) != null)
{
client = new Socket(ClientIP, ClientPORT); // Create the Socket
}
}
} catch (IOException e)
{
e.printStackTrace();
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
这是Connect.java活动:
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.PrintWriter;
import java.net.Socket;
public class Connect extends AppCompatActivity
{
public Socket client;
private EditText etIP, etPORT;
private TextView status,IPs;
private Button buttonCON;
public int port=0;
public String IP;
SharedPreferences savednotes;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_connect);
etIP = (EditText)findViewById(R.id.editTextIP);
etPORT = (EditText)findViewById(R.id.editText2);
buttonCON= (Button)findViewById(R.id.buttonCON);
status= (TextView)findViewById(R.id.textStatus);
IPs=(TextView)findViewById(R.id.textViewIP);
status.setText("Disconnected");
buttonCON.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
port = Integer.parseInt(etPORT.getText().toString());
IP= etIP.getText().toString();
IPs.setText(IP);
savednotes=
getApplicationContext().getSharedPreferences("Socket_NAME",
Context.MODE_MULTI_PROCESS);
SharedPreferences.Editor editor= savednotes.edit();
editor.putString("IP_NAME",IP);
editor.apply();
editor.putInt("PORT_NAME",port);
editor.apply();
Intent Socketintent= new Intent(Connect.this, SocketService.class);
startService(Socketintent);
int i = 0xFF00EE00;
status.setTextColor(i);
status.setText("Connected");
if (!client.isClosed())
{
Intent relay= new Intent(Connect.this, Relay.class);
startActivity(relay);
finish();
}
}
});
}
}
答案 0 :(得分:0)
IntentService
不适合您的目标。只要IntentService
返回,就会销毁onHandleIntent()
。
最有可能的是,您在这里不需要任何Service
。 Service
适用于当前台没有UI时想要工作的时候,这听起来不像你的情况(“在活动之间保持客户端套接字活着”)。只要你非常小心不引入内存泄漏,普通的Java单例就行了。
在每个活动中创建和关闭套接字的方法都不起作用,因为它将在服务器端注册为新用户 - 我无法访问的模块上的固件。
请记住,您的过程不会永远存在。最终,您需要创建一个新套接字。