2015-02-11 35 views
-1

發送列表,從後臺服務的活動,我想送從後臺服務列表,以活動的Android我如何能在Android的

public class MyService extends Service{ 

    private String receiverUserInfoId; 
    private String loginUserInfoId; 
    private String orgMsgThreadId; 
    private String userName = "Vipin"; 
    DatabaseHelper db; 
    MessageListActivity ms; 
    private String userAvatarURL; 

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

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     db = new DatabaseHelper(getApplicationContext()); 
     Bundle extra = intent.getExtras(); 
     loginUserInfoId = extra.getString("LoginUserInfoId"); 
     receiverUserInfoId=extra.getString("UserInfoId"); 
     orgMsgThreadId = extra.getString("OrgMessageThreadId"); 
     userName=extra.getString("UserName"); 
     userAvatarURL=extra.getString("UserAvatarURL"); 


     new syncMessageFromServer().execute(); 
     new SyncPendingMessageToServer(); 


     return super.onStartCommand(intent, flags, startId); 
    } 
private class syncMessageFromServer extends AsyncTask<Void, Integer, String> { 

     @Override 
     protected void onPreExecute() { 
      // setting progress bar to zero 
      //progressBar.setProgress(0); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 

     } 

     @Override 
     protected String doInBackground(Void... params) { 
      return uploadFile(); 
     } 

     @SuppressWarnings("deprecation") 
     private String uploadFile() { 
      String str = ""; 
      HttpResponse response; 
      HttpClient myClient = new DefaultHttpClient(); 
      HttpPost myConnection = new HttpPost("http://192.168.1.2/AndroidApp/GetMessage?loginUserInfoId=" + loginUserInfoId + "&recieverUserInfoId=" + receiverUserInfoId + "&isPendingToSynce=" + true); 

      try { 
       response = myClient.execute(myConnection); 
       str = EntityUtils.toString(response.getEntity(), "UTF-8"); 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      try { 
       JSONArray jArray = new JSONArray(str); 
       for (int i = 0; i <= jArray.length() - 1; i++) { 
        JSONObject row = jArray.getJSONObject(i); 
        ChatMessage cm = new ChatMessage(); 

        cm.setOriginalMsgThreadId(row.getString("MessageThreadId")); 
        cm.setSenderUserInfoId(row.getString("SenderUserId")); 
        cm.setReceiverUserInfoId(row.getString("MultipleReceiversId")); 
        cm.setMessageStatus("SENT"); 
        cm.setIsPending(0); 
        cm.setMessageText(row.getString("MessageText")); 
        cm.setMediaURL(offlineFileURL); 
        cm.setThumbImage(offlineFileURL); 
        cm.setMediaMIMEType(""); 
        cm.setMediaSize(0); 
        cm.setMediaName(""); 
        cm.setLatitude(""); 
        cm.setLongitude(""); 
        cm.setSendTimeStamp(row.getString("SendTime")); 
        cm.setReceiveTimeStamp(row.getString("ReadTime")); 
        long messageThreadId = db.SendMessage(cm); 

        MessageListActivity mLA = new MessageListActivity(); 
        mLA.SetListData(cm); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return str; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      new syncMessageFromServer().execute(); 

     } 
    } 
} 

我想送ChatMessage到SetListData()函數MessageListActivity類我怎樣才能做到這一點。只是我想刷新我的列表適配器到由服務器獲取的新消息

+0

你也可以使用Otto。它用於傳遞消息而不必保留偵聽器引用。這意味着你不必擔心活動娛樂。你可以在這裏找到文檔和設置:https://github.com/square/otto – SnyersK 2015-02-11 15:13:27

回答

3

如果您想與活動進行通信,則需要使用信使。改變你的服務是這樣的:

public class MyService extends Service{ 
    public static int MESSENGER = 1; 
    public static int JSONARRAY = 2; 
    private String receiverUserInfoId; 
    private String loginUserInfoId; 
    private String orgMsgThreadId; 
    private String userName = "Vipin"; 
    DatabaseHelper db; 
    MessageListActivity ms; 
    private String userAvatarURL; 
    Messenger messageActivity; 
    final Messenger mMessenger = new Messenger(new IncomingHandler()); 

    class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     switch(msg.what){ 
      case MESSENGER: 
        messageActivity = msg.replyTo; 
        break; 
     } 
    }  

    @Override 
public IBinder onBind(Intent intent) { 
    return mMessenger.getBinder(); 
} 

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

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     db = new DatabaseHelper(getApplicationContext()); 
     Bundle extra = intent.getExtras(); 
     loginUserInfoId = extra.getString("LoginUserInfoId"); 
     receiverUserInfoId=extra.getString("UserInfoId"); 
     orgMsgThreadId = extra.getString("OrgMessageThreadId"); 
     userName=extra.getString("UserName"); 
     userAvatarURL=extra.getString("UserAvatarURL"); 


     new syncMessageFromServer().execute(); 
     new SyncPendingMessageToServer(); 


     return super.onStartCommand(intent, flags, startId); 
    } 
private class syncMessageFromServer extends AsyncTask<Void, Integer, String> { 

     @Override 
     protected void onPreExecute() { 
      // setting progress bar to zero 
      //progressBar.setProgress(0); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 

     } 

     @Override 
     protected String doInBackground(Void... params) { 
      return uploadFile(); 
     } 

     @SuppressWarnings("deprecation") 
     private String uploadFile() { 
      String str = ""; 
      HttpResponse response; 
      HttpClient myClient = new DefaultHttpClient(); 
      HttpPost myConnection = new HttpPost("http://192.168.1.2/AndroidApp/GetMessage?loginUserInfoId=" + loginUserInfoId + "&recieverUserInfoId=" + receiverUserInfoId + "&isPendingToSynce=" + true); 

      try { 
       response = myClient.execute(myConnection); 
       str = EntityUtils.toString(response.getEntity(), "UTF-8"); 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      try { 
       JSONArray jArray = new JSONArray(str); 
       messageActivity.send(Message.obtain(null, JSONARRAY, jArray.toString())); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return str; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      new syncMessageFromServer().execute(); 

     } 
    } 
} 

而在你的活動添加了以下方法:

public class MyListActivity extends Activity{ 
    public static Messenger mService = null; 
    public final Messenger mMessenger = new Messenger(new IncomingHandler()); 
    public boolean mIsBound = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_participant); 
     doBindService(); 
    } 

public void doBindService() { 
     if (!mIsBound) { 
      context.bindService(new Intent(context, 
        MyService.class), mConnection, Context.BIND_AUTO_CREATE); 
      mIsBound = true; 
     } 
    } 

     private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, 
             IBinder service) { 
      mService = new Messenger(service); 

      try { 
       Message msg = Message.obtain(null, MyService.MESSENGER); 
       msg.replyTo = mMessenger; 
       mService.send(msg); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mService = null; 

     } 
    }; 

class IncomingHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case MyService.JSONARRAY: 
        buildTheChatMessage((JsonArray)msg.obj); 

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

    public void buildTheChatMessage(JsonArray arr){ 
      ChatMessage cm = new ChatMessage(); 

        cm.setOriginalMsgThreadId(row.getString("MessageThreadId")); 
        cm.setSenderUserInfoId(row.getString("SenderUserId")); 
        cm.setReceiverUserInfoId(row.getString("MultipleReceiversId")); 
        cm.setMessageStatus("SENT"); 
        cm.setIsPending(0); 
        cm.setMessageText(row.getString("MessageText")); 
        cm.setMediaURL(offlineFileURL); 
        cm.setThumbImage(offlineFileURL); 
        cm.setMediaMIMEType(""); 
        cm.setMediaSize(0); 
        cm.setMediaName(""); 
        cm.setLatitude(""); 
        cm.setLongitude(""); 
        cm.setSendTimeStamp(row.getString("SendTime")); 
        cm.setReceiveTimeStamp(row.getString("ReadTime")); 
        setListData(cm); 
    } 


} 

這樣,你的活動被綁定到服務,你可以在它們之間進行通信。我希望你從這段代碼中得到想法並實現你需要的東西。

Here的來源閱讀更多關於這種方法。