Доступ к обработчику streamов пользовательского интерфейса из службы

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

Я знаю следующее:

  1. В streamе пользовательского интерфейса есть собственный обработчик и петлитель
  2. Любое сообщение будет помещено в очередь сообщений в streamе пользовательского интерфейса
  3. Петлеер берет событие и передает его обработчику
  4. Обработчик обрабатывает сообщение и отправляет specfic-событие в пользовательский интерфейс.

Я хочу получить мою службу, которая должна получить обработчик streamа пользовательского интерфейса и поместить сообщение в этот обработчик. Так что это сообщение будет обработано и будет выдано пользовательскому интерфейсу. Здесь услуга будет обычной услугой, которая будет запущена некоторым приложением.

Я хотел бы знать, возможно ли это. Если да, предложите несколько fragmentов кода, чтобы я мог попробовать.

С уважением, Гириш

    Этот fragment кода создает обработчик, связанный с основным (UI) streamом:

    Handler handler = new Handler(Looper.getMainLooper()); 

    Затем вы можете публиковать материал для выполнения в главном (UI) streamе так:

     handler.post(runnable_to_call_from_main_thread); 

    Если сам обработчик создается из основного (UI) streamа, аргумент можно опустить для краткости:

     Handler handler = new Handler(); 

    В руководстве Android Dev для процессов и streamов содержится дополнительная информация.

    Создайте объект Messenger прикрепленный к вашему Handler и передайте этот Messenger Service (например, в Intent extra для startService() ). Затем Service может отправить Message Handler через Messenger . Вот пример приложения, демонстрирующий это.

    На данный момент я предпочитаю использовать библиотеку событийных событий, такую ​​как Otto для этой проблемы. Просто подпишите нужные компоненты (активность):

     protected void onResume() { super.onResume(); bus.register(this); } 

    Затем укажите метод обратного вызова:

     public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. } 

    а затем, когда ваша служба выполнит такой оператор:

     bus.post(new TimeLeftEvent(340)); 

    Этот POJO будет передан вашему вышеуказанному действию и всем другим подписным компонентам. Простой и элегантный.

    Вы можете получать значения через широковещательный приемник …… следующим образом: сначала создайте свой собственный IntentFilter как,

     Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER"); 

    Затем создайте внутренний class BroadcastReceiver как,

      private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { /** Receives the broadcast that has been fired */ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; 

    Теперь зарегистрируйте свой широковещательный приемник в onResume () как,

     registerReceiver(broadcastReceiver, intentFilter); 

    И, наконец, Unregister BroadcastReceiver в onDestroy () как,

     unregisterReceiver(broadcastReceiver); 

    Теперь самая важная часть … Вам нужно запустить широковещательную рассылку туда, где вам нужно отправлять значения ….. так делать,

     Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i); 

    …. приветствия 🙂

    Решение:

    1. Создайте обработчик с Looper из основного streamа: requestHandler
    2. Создайте Handler с Looper из основного streamа: responseHandler и переопределите метод handleMessage
    3. отправить задание Runnable по запросуHandler
    4. Внутри задачи Runnable вызовите sendMessage на responseHandler
    5. Этот результат sendMessage handleMessage в responseHandler.
    6. Получить атрибуты из Message и обработать его, обновить интерфейс

    Образец кода:

      /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Override public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepare message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } 
    Давайте будем гением компьютера.