使用服务

时间:2018-06-07 12:06:11

标签: java android

我想在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();
                }

            }

        });

    }
}

1 个答案:

答案 0 :(得分:0)

IntentService不适合您的目标。只要IntentService返回,就会销毁onHandleIntent()

最有可能的是,您在这里不需要任何ServiceService适用于当前台没有UI时想要工作的时候,这听起来不像你的情况(“在活动之间保持客户端套接字活着”)。只要你非常小心不引入内存泄漏,普通的Java单例就行了。

  

在每个活动中创建和关闭套接字的方法都不起作用,因为它将在服务器端注册为新用户 - 我无法访问的模块上的固件。

请记住,您的过程不会永远存在。最终,您需要创建一个新套接字。