Как установить соединение с сервером, когда приложение закрыто - PullRequest
1 голос
/ 11 октября 2019

В моем приложении для Android я хочу установить соединение с сервером, которое должно запускаться, когда приложение также закрывается. Цель состоит в том, чтобы получать уведомления от сервера и показывать их на устройстве

Я попытался создать службу, в которой я запускаю поток ServerConnection-Thread, но поток останавливается, когда я закрываю приложение.

public class InternetService extends Service {
 public static final String START_SERVER = "startserver";
  public InternetService(){

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startID){
        String action = intent.getAction();
        if(action.equals(START_SERVER)){
            //new thread to start server in non-ui-thread
            Thread server = new Thread(new Server());
            server.start();
        }


        return START_STICKY;
    }
}

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    Intent server = new Intent(this, InternetService.class);
        server.setAction(InternetService.START_SERVER);
        startService(server);
    }
}


public class Server implements Runnable {
    public void run(){
        server = new Socket(IP_ADDRESS, PORT);
        out = new PrintWriter(server.getOutputStream());
        in = new BufferedReader(new InputStreamReader(server.getInputStream()));
    }
}

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Поведение сервисов изменилось с более высокими версиями. Посмотрите https://developer.android.com/about/versions/oreo/background

Если вы хотите отправить уведомление с сервера, попробуйте использовать Firebase .

1 голос
/ 11 октября 2019

Вы можете использовать свой сервис в качестве приоритетного сервиса, который будет постоянным, даже если ваше приложение закрыто. Для этого вам нужно всего лишь добавить уведомление к вашему сервису. Для версий Android новее, чем Android 8, необходимо создать канал уведомлений для отображения уведомлений. Вы можете прочитать об этом в документации здесь: https://developer.android.com/training/notify-user/build-notification#java

Интегрируйте уведомление в файл службы и запустите его как службу переднего плана. Тогда это может выглядеть так:

createNotificationChannel();
 Notification notification = new NotificationCompat.Builder(this, "channelID")
              .setSmallIcon(R.drawable.notification_icon)
              .setContentTitle("My notification")
              .setContentText("Much longer text that cannot fit one line...")
              .build();


 private void createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel serviceChannel = new NotificationChannel(
                "channelID",
                "Channel Name",
                importance
        );

        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(serviceChannel);
    }
}
...