0

是否可以將線程綁定到服務?從線程綁定服務

我嘗試傳遞一個字符串到服務運行,並運行一個方法來顯示通知?

任何想法什麼是正確的做法呢?

在此先感謝。

回答

0

可以試試這種方式: 先寫下你的Service類。

public class ShowNotifyService extends Service { 

    private Messenger msg = new Messenger(new ShowNotifyHanlder()); 

    @Override 
    public IBinder onBind(Intent arg0) {     
     return msg.getBinder(); 
    } 

    class ShowNotifyHanlder extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      // This is the action 
      int msgType = msg.what; 

      switch(msgType) { 
      case SHOW_FIRST_NOTIFY: { 
       try { 
        // Incoming data 
        String data = msg.getData().getString("data"); 
        Message resp = Message.obtain(null, SHOW_FIRST_NOTIFY_RESPONSE); 
        Bundle bResp = new Bundle(); 
        bResp.putString("respData", first_notify_data);// here you set the data you want to show 
        resp.setData(bResp); 

        msg.replyTo.send(resp); 
       } catch (RemoteException e) { 

        e.printStackTrace(); 
       } 
       break; 
      } 
      default: 
       super.handleMessage(msg); 
      } 
     } 
} 

然後寫你的Activity類。

public class TestActivity { 

    .. 
    private ServiceConnection sConn; 
    private Messenger messenger; 
    .. 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      // Service Connection to handle system callbacks 
      sConn = new ServiceConnection() { 

       @Override 
       public void onServiceDisconnected(ComponentName name) { 
        messenger = null; 
       } 

       @Override 
       public void onServiceConnected(ComponentName name, IBinder service) { 
        // We are conntected to the service 
        messenger = new Messenger(service); 

       } 
      }; 
    ... 
      // We bind to the service 
      bindService(new Intent(this, ShowNotifyService.class), sConn, 
        Context.BIND_AUTO_CREATE); 
    .. 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String val = edt.getText().toString(); 
       Message msg = Message.obtain(null, ShowNotifyService.SHOW_FIRST_NOTIFY); 

       msg.replyTo = new Messenger(new ResponseHandler()); 
       // We pass the value 
       Bundle b = new Bundle(); 
       b.putString("data", val); 

       msg.setData(b); 

       try { 
        messenger.send(msg); 
       } catch (RemoteException e) {      
        e.printStackTrace(); 
       } 

      } 

     }); 
    } 

    // This class handles the Service response 
    class ResponseHandler extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      int respCode = msg.what; 

      switch (respCode) { 
       case ShowNotifyService.SHOW_FIRST_NOTIFY_RESPONSE: { 
        result = msg.getData().getString("respData"); 
        //then you show the result data from service here 
       } 
      } 
     } 

    } 
} 

我從here得到了這個想法。

+0

如果我不在活動上怎麼樣? 如果不想從非活動綁定服務,該如何處理? 這可能嗎? –

+0

你可以顯示你的代碼嗎? – penkzhou

+0

我解決了。但你給我的答案的主要想法。謝謝。 –