Страницы

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

четверг, 13 февраля 2020 г.

Как закрыть другое Activity из класса, наследующего Service?

#java #android #многопоточность #service


Мой класс MyService:  

public class MyService extends Service
{
    IBinder mBinder;
    public static boolean status = true;

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

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

    @Override
    public void onDestroy()
    {
        Log.e("MY_SERVICE", "onDestroy()");
        new CheckThread().stop();
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent)
    {
        return mBinder;
    }

    public void someTask()
    {
        new CheckThread().start();
    }

    public class CheckThread implements Runnable
    {
        Thread th;

        @Override
        public void run()
        {
            main();
        }

        public void start()
        {
            th = new Thread(this);
            th.setPriority(Thread.NORM_PRIORITY);
            Log.e("CheckThread", "start()");
            th.start();
        }

        public synchronized void stop()
        {
            th = null;
            status = false;
            Log.e("CheckThread", "stop()");
            notify();
        }

        public void main()
        {
            while (status)
            {
                if ( ! status)
                    stop();
                boolean connect = Vars.connect;
                if ( ! connect)
                {
                    Intent intent = new Intent("android.intent.action.MAIN");
                    intent.setClass(MyService.this, Disconnect.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    status = false;
                    stop();
                }
                try
                {
                    Thread.sleep(3000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}


Класс Disconnect запускается, когда закрывается Socket-соединение (класс не наследует
Activity, функции с UI недоступны).

    new Thread(new Runnable()
    {
        public void run()
        {
            String str = "";
            try
            {
                while ((str = in.readLine()) != null)
                {

                }
            }
            catch (IOException e)
            {
            }
            Vars.connect = false;
        }
    }).start();


Возможно ли как-то сделать так, чтобы при открытии класса Disconnect в MyService
закрывалось другое активное Activity, чтобы был активен только Disconnect? 

Ответов, как закрыть другое Activity из класса, наследующего Service, я не нашёл.
    


Ответы

Ответ 1



Только сама Activity может завершить себя (также она может быть завершена ОС). Из Service надо послать сигнал Activity на завершение, по получении которого она сама вызовет finish(). Сделать это можно одним из способов, описанных в этом ответе. Лично я рекомендую LocalBroadcastManager.

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

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