如何在android中将列表从后台服务发送到活动

如何在android中将列表从后台服务发送到活动,android,android-asynctask,android-service,Android,Android Asynctask,Android Service,我想把一个列表从后台服务发送到android中的活动 public class MyService extends Service{ private String receiverUserInfoId; private String loginUserInfoId; private String orgMsgThreadId; private String userName = "Vipin"; DatabaseHelper db; Messag

我想把一个列表从后台服务发送到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();

        }
    }
}
公共类MyService扩展服务{
私有字符串receiverUserInfoId;
私有字符串loginUserInfoId;
私有字符串orgMsgThreadId;
私有字符串userName=“Vipin”;
数据库辅助数据库;
messagelistms;
私有字符串userAvatarURL;
@凌驾
public void onCreate(){
super.onCreate();
}
@凌驾
公共空间{
super.ondestory();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
db=新的DatabaseHelper(getApplicationContext());
Bundle extra=intent.getExtras();
loginUserInfoId=extra.getString(“loginUserInfoId”);
receiverUserInfoId=extra.getString(“UserInfoId”);
orgMsgThreadId=extra.getString(“OrgMessageThreadId”);
userName=extra.getString(“用户名”);
userAvatarURL=extra.getString(“userAvatarURL”);
新建syncMessageFromServer().execute();
新建SyncPendingMessageToServer();
返回super.onStartCommand(intent、flags、startId);
}
私有类syncMessageFromServer扩展异步任务{
@凌驾
受保护的void onPreExecute(){
//将进度条设置为零
//progressBar.setProgress(0);
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(整数…进度){
}
@凌驾
受保护字符串doInBackground(无效…参数){
返回上传文件();
}
@抑制警告(“弃用”)
私有字符串上传文件(){
字符串str=“”;
HttpResponse响应;
HttpClient myClient=新的默认HttpClient();
HttpPost myConnection=新的HttpPost(“http://192.168.1.2/AndroidApp/GetMessage?loginUserInfoId=“+LoginUserInfo+”&ReceiveUserInfoId=“+ReceiveUserInfoId+”&isPendingToSynce=“+true”);
试一试{
response=myClient.execute(myConnection);
str=EntityUtils.toString(response.getEntity(),“UTF-8”);
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
JSONArray jArray=新JSONArray(str);

对于(int i=0;i如果要与活动进行通信,您需要使用messenger。请按以下方式更改您的服务:

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();

        }
    }
}
通过这种方式,您的活动将绑定到服务,并且您可以在它们之间进行通信。我希望您能从这段代码中获得想法并实现所需的功能


这是阅读有关此方法的更多信息的来源。

您也可以使用Otto。它用于传递消息,而无需保留侦听器引用。这意味着您不必担心活动的重新创建。您可以在此处找到文档和设置:
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);
    }


}