Я хочу сделать фоновую службу в приложении для Android, которая должна работать, даже когда приложение закрыто

Я хочу сделать фоновую службу в приложении для Android, которая должна работать всегда, даже когда приложение находится в закрытом, убитом или фоновом состоянии, в настоящее время у меня есть фоновая служба, которая хорошо работает, когда приложение свернуто, но когда я закрываю приложение и убиваю приложение, оно не работает Работа. сокет закрывается, если приложение убивает, даже если я использовал изолированный Android Процесс true .....
я хочу сделать сокет доступным в любых условиях

public class MyTestService extends IntentService {

private ServerSocket serverSocket;
private Socket tempClientSocket;
Thread serverThread = null;
public static final int SERVER_PORT = 3001;

public MyTestService() {
    // Used to name the worker thread, important only for debugging.
    super("test-service");
}

@Override
public void onCreate() {
    super.onCreate(); // if you override onCreate(), make sure to call super().
    // If a Context object is needed, call getApplicationContext() here.
}

@Override
protected void onHandleIntent(Intent intent) {
    Socket socket;
    try {
        serverSocket = new ServerSocket(SERVER_PORT);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (null != serverSocket) {
        while (true) {
            try {
                socket = serverSocket.accept();
                try {
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String mess = input.readLine();
                    BufferedWriter bf = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    PrintWriter out = new PrintWriter(bf,true);
                    out.println("message recieve");
                    input.close();
                    bf.close();
                    serverSocket.close();

                    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "asdsadasd")
                            .setSmallIcon(R.drawable.ic_launcher_background)
                            .setContentTitle("Title")
                            .setContentText(mess)
                            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                            .setAutoCancel(true);

                    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
                    notificationManager.notify(1, mBuilder.build());
                } catch (IOException e) {
                e.printStackTrace();
            }
        }
        catch (Exception e){
            }
        }
    }
  }
}

person Muhammad Aadil Banaras    schedule 12.06.2018    source источник


Ответы (2)


В зависимости от того, что именно вы хотите сделать, я бы посмотрел на WorkManager.

fun workRequest() {

    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(true)
        .build()

    val worker: WorkRequest =
        PeriodicWorkRequestBuilder<DetailsWorker>(6, TimeUnit.HOURS)
            .setInputData(workRequestData)
            .setConstraints(constraints)
            .build()

    WorkManager.getInstance().enqueue(worker)
} 
person tgrable    schedule 12.06.2018
comment
как и где его использовать, сэр, потому что я создал службу и использовал код прослушивания на основе сокетов в отдельном потоке. - person Muhammad Aadil Banaras; 12.06.2018
comment
Я действительно хочу запустить службу в фоновом режиме, которая получает данные из сокета, даже если приложение убивает. - person Muhammad Aadil Banaras; 12.06.2018
comment
Я обновил свой вопрос, пожалуйста, проверьте его и скажите мне в этой ситуации, как я достигну своей цели Я предоставил код, который я использовал - person Muhammad Aadil Banaras; 13.06.2018

Вы можете использовать JobScheduler в API платформы Android для планирования задач или работы в фоновом режиме. Вы также можете указать тип сети или период, в который вы хотите запустить задание, или несколько других параметров. Создайте класс, расширяющий класс JobService, и переопределите методы onStartJob и onStopJob.

public class myJob extends JobService {
      public boolean onStartJob(JobParameters jobParameters) {
      }
       public boolean onStopJob(JobParameters jobParameters) {
      }
 }

В OnStartJob напишите код, который вы хотите запустить в фоновом режиме. Добавьте это в JobInfo, который используется для настройки работы службы заданий.

JobInfo.Builder builder = new JobInfo.Builder(jobID, new ComponentName(context, Myjob.service));

В JobInfo.Builder` вы можете включить критерии планирования. Например:

    builder.setPeriodic(10000);
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);

Создайте экземпляр Jobscheduler и передайте данные JobInfo сверху. Это вызовет класс JobService на основе указанного вами параметра планирования.

JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    jobScheduler.schedule(builder.build());

Дополнительная информация о планировщике заданий: https://developer.android.com/topic/performance/scheduling < / а>

person Psypher    schedule 12.06.2018
comment
Сэр, я обновил свой вопрос, пожалуйста, просмотрите его и расскажите мне в этом состоянии, как я достигаю своей цели ... - person Muhammad Aadil Banaras; 13.06.2018
comment
Какая у вас версия api ..? будет ниже API 26? - person Psypher; 13.06.2018