Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Как отправить данные в уже запущенный Service?

#android #service #android_intent


Как отправить данные в уже работающий сервис?

activity_main.xml




    

    

    



MainActivity.java

package com.example.my.myapplication;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

import android.view.View;
import android.widget.EditText;


public class MainActivity extends Activity {

    public final static String BROADCAST_ACTION = "com.example.my.myapplication";

    BroadcastReceiver br;
    EditText EditText1;
    EditText EditText2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText1 = (EditText) findViewById(R.id.editText1);
        EditText2 = (EditText) findViewById(R.id.editText2);

        // создаем BroadcastReceiver
        br = new BroadcastReceiver() {
            // действия при получении сообщений
            public void onReceive(Context context, Intent intent) {
                int result = intent.getIntExtra("result", 0);
                String re = Integer.toString(result);
                EditText2.setText(re);
            }
        };
        // создаем фильтр для BroadcastReceiver
        IntentFilter intFilt = new IntentFilter(BROADCAST_ACTION);
        // регистрируем (включаем) BroadcastReceiver
        registerReceiver(br, intFilt);


        Intent intent;

        // Создаем Intent для вызова сервиса,
        // кладем туда параметр времени и код задачи
        int s = Integer.parseInt(EditText1.getText().toString());
        intent = new Intent(this, MyService.class).putExtra("time", s);
        intent.putExtra("time", s);
        // стартуем сервис
        startService(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // дерегистрируем (выключаем) BroadcastReceiver
        unregisterReceiver(br);
    }

    public void onClickStart(View v) {
        Intent intent;
        int s = Integer.parseInt(EditText1.getText().toString());
        intent = new Intent(this, MyService.class).putExtra("time", s);
        intent.putExtra("time", s);
    }

}


MyService.java

package com.example.my.myapplication;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {

    ExecutorService es;

    public void onCreate() {
        super.onCreate();
        es = Executors.newFixedThreadPool(1);
    }

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

    public int onStartCommand(Intent intent, int flags, int startId) {

        int time = intent.getIntExtra("time", 1);
        MyRun mr = new MyRun(startId, time);
        es.execute(mr);

        return super.onStartCommand(intent, flags, startId);
    }

    public IBinder onBind(Intent arg0) {
        return null;
    }

    class MyRun implements Runnable {

        int time;
        int startId;

        public MyRun(int startId, int time) {
            this.time = time;
            this.startId = startId;
        }

        public void run() {
            Intent intent = new Intent(MainActivity.BROADCAST_ACTION);
            while (true) {
                try {
                    // начинаем выполнение задачи
                    TimeUnit.SECONDS.sleep(time);
                    // сообщаем об окончании задачи
                    intent.putExtra("result", time * 100);
                    sendBroadcast(intent);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
           // stop();
        }

        void stop() {
            stopSelfResult(startId);
        }
    }
}


Что я хочу от приложения: при запуске стартует сервис, ему отправляется число. Он
это число умножает на 100 и отправляет результат в активити во второе текстовое поле
(причём продолжает работать дальше). Далее я хочу отправить сервису новое число, не
останавливая его работу, ввожу новое число в первое тестовое поле, и при нажатии на
кнопку надо отправить сервису это число. А он должен его также умножить на 100 и отправить
обратно в активити в первое текстовое поле. Не могу разобраться, как передавать данные
уже запущенному сервису. Подскажите.
    


Ответы

Ответ 1



Запущенный сервис будет работать пока у него не вызван stopSelf(). Передавать данные в сервис можно так же с помощью startService(intent), новый сервис запускаться при этом не будет, а у запущенного сервиса будет вызван onStartCommand. Таким образом, вам надо убрать бесконечный цикл из MyRun.run(), реализовать логику ваших умножений, убрать stopSelfResult из MyRun.stop() и добавить startService(intent); в onClickStart вашей активити. Чтобы таки потом остановить сервис, запустите его с другим intent'ом, в onStartCommand обработайте его: остановите ваш пул или подождите пока он не отработает (см. тут). Затем вызовите stopSelf.

Комментариев нет:

Отправить комментарий