Подключение к серверу в фоновом режиме при загрузке - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь создать службу, которая работает в фоновом режиме и запускается при загрузке устройства. Служба должна запустить AsyncTask, которая ожидает сообщений от сервера.

Класс BootReceiver:

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "In boot receiver app", Toast.LENGTH_LONG).show();
        context.startService(new Intent(context, AppService.class));
    }
}

Класс обслуживания:

public class AppService extends Service{
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate(){
        super.onCreate();
        try {
            Toast.makeText(this, "In service app", Toast.LENGTH_LONG).show();
            String message = new ListenForUpdates().execute(getApplicationContext()).get();
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
    }
}

Класс AsyncTask:

public class ListenForUpdates extends AsyncTask<Context, Void, String> {
    private static final int portNumber = 12302;
    private ServerSocket serverSocket;
    private Socket socket;
    private BufferedReader in;
    private Context context;

    @Override
    protected String doInBackground(Context... c) {
        String message = "";
        context = c[0];
        try {
            message = connectAndListen();
            in.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return message;
    }

    private String connectAndListen() throws IOException {
        serverSocket = new ServerSocket(portNumber);
        String message;
        while (true){
            socket = serverSocket.accept();
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while ((message = in.readLine()) != null){
                message = in.readLine();
                break;
            }
            break;
        }
        return message;
    }
}

Дополнения к androidManifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application
        ...
        <service
            android:name=".connections.AppService"
            android:theme="@style/AppTheme.CustomTheme">
        </service>
        <receiver android:name=".connections.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
 </application>

Код на стороне сервера:

try {
    Socket s = new Socket("10.0.2.2", 12302);
    BufferedWriter b = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    b.write("Received update! \n");
    b.flush();
    b.close();
    s.close();
    } catch (IOException e) {
        e.printStackTrace();
}

Когда я пытаюсь отправить сообщения на сервер, время ожидания истекает, как будто AsyncTask еще не запущен (?). Что я здесь не так делаю?

...