【问题标题】:How can I call a Method of an activity from background service?如何从后台服务调用活动的方法?
【发布时间】:2015-02-19 06:00:56
【问题描述】:

我想通过从后台服务接收到新数据来更新我的ChatMessageAdapter,以便我想从后台调用UpdateAdapter 方法来更新适配器。

这是我的ServiceClass

public class MyService extends Service{

private String loginUserInfoId;
SessionManager session;
DatabaseHelper db;
MessageListActivity mLA;

long totalSize = 0;

@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());
    mLA = new MessageListActivity();

    session = new SessionManager(getApplicationContext());
    session.checkLogin();
    HashMap<String, String> user = session.getUserDetails();
    loginUserInfoId = user.get(SessionManager.KEY_USER_INFO_ID);

    if(isInternetOn()) {
        new syncMessageFromServer().execute();
        new SyncPendingMessageToServer();
    }


    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

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/GetAllMessage/" + loginUserInfoId);

        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();
                String offlineFileURL = "";

                /******* Firstly take data in model object ******/
                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"));

                mLA.UpdateAdapter(ChatMessage cm);

                long messageThreadId = db.SendMessage(cm);


            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return str;
    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if(isInternetOn()) {
            new syncMessageFromServer().execute();
        }

    }
}

}

这是我的 MessageActivityList 类:

public class MessageListActivity extends ActionBarActivity {

private String receiverUserInfoId;
private String loginUserInfoId;
private String orgMsgThreadId;
private String userName;
private String uploadedFileURL = "";

DatabaseHelper db;
SessionManager session;
private ChatMessageAdapter chatMessageAdapter;

private EditText chatText;
private ImageButton buttonSend;
private ListView listView;

private static final String TAG = MessageListActivity.class.getSimpleName();


// Camera activity request codes
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

private Uri fileUri; // file url to store image/video

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

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());

    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
            .penaltyLog()
            .build());

    db = new DatabaseHelper(getApplicationContext());

    session = new SessionManager(getApplicationContext());
    session.checkLogin();
    HashMap<String, String> user = session.getUserDetails();
    loginUserInfoId = user.get(SessionManager.KEY_USER_INFO_ID);

    Intent intent=getIntent();
    Bundle extra = intent.getExtras();
    receiverUserInfoId=extra.getString("UserInfoId");
    orgMsgThreadId = extra.getString("OrgMessageThreadId");
    userName=extra.getString("UserName");
    setTitle(userName);

    listView = (ListView) findViewById(R.id.messageList);
    chatMessageAdapter = new ChatMessageAdapter(getApplicationContext(), R.layout.activity_single_message);
    listView.setAdapter(chatMessageAdapter);

    buttonSend = (ImageButton) findViewById(R.id.buttonSend);
    chatText = (EditText) findViewById(R.id.chatText);
    chatText.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                if(chatText.getText().toString().trim().length() > 0){
                    sendChatMessage();
                }

            }
            return false;
        }
    });
    buttonSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            sendChatMessage();
        }
    });

    listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    // listView.setAdapter(chatMessageAdapter);

    //to scroll the list view to bottom on data change
    chatMessageAdapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            listView.setSelection(chatMessageAdapter.getCount() - 1);
        }
    });
    setListData();
}

public void UpdateAdapter(ChatMessage cm) {
            chatMessageAdapter.add(cm);
    }
}

调用这个UpdateAdapter方法来更新我服务器收到的ChatMessage怎么办?

【问题讨论】:

标签: android android-service android-actionbaractivity


【解决方案1】:

您应该使用LocalBroadcastReceiver

在 onResume 中注册接收更新,在 onPause 中取消注册。

【讨论】:

  • 你能给我一个源代码吗?我不知道 LocalBroadcastReciever
  • 在 cmets 部分浏览 user2450263 提供的链接。
【解决方案2】:

你可以使用广播接收器从服务更新 UI。

在你的Activity的onCreate()中注册广播接收器:

private UpdateReceiver updateReceiver;
 if (UpdateReceiver == null) 
 {
     updateReceiver = new UpdateReceiver();
     IntentFilter intentFilter = new  
                     IntentFilter("REFRESH_DATA");    
     registerReceiver(updateReceiver, intentFilter);
 }

在你的 Activity 的 onDestroy() 中取消注册

if (updateReceiver != null) unregisterReceiver(updateReceiver);

在你的 Activity 中定义广播接收器:

private class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("REFRESH_DATA")) {
      //update adapter from here
    }
  }
} 

在您想要更新适配器的服务中,调用 sendBroadcast。喜欢:

Intent intent=new Intent("REFRESH_DATA");
//u can pass the data through putExtras
sendBroadcast(intent);

【讨论】:

  • 如何发送有意图的 ChatMessage
  • 你可以通过intent发送对象,比如intent.putExtras(key, object),但是聊天消息应该是可序列化或可打包的。
  • 我已经发送了类似 long messageId = db.SendMessage(cm); 的数据意图意图=新意图(“REFRESH_DATA”); intent.putExtra("id", messageId);发送广播(意图);并接收好像 (intent.getAction().equals("REFRESH_DATA")) { intent=getIntent();捆绑额外 = intent.getExtras(); int chatMessageId = extra.getInt("id"); } 但它没有收到值
  • 您通过 putExtras 发送长值,因此,您将使用 extra.getLong("id") 而不是 getInt 获得结果
【解决方案3】:

使用广播接收器从服务更新 UI,并在您要接收的 MainActivity 的 onCreate() 中注册广播接收器

代码如下所示

private UpdateReceiver updateReceiver;
 if (UpdateReceiver == null) 
 {
     updateReceiver = new UpdateReceiver();
     IntentFilter intentFilter = new  
                     IntentFilter("REFRESH_DATA");    
     registerReceiver(updateReceiver, intentFilter);
 }

并创建类以检查是否收到更新

    private class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("REFRESH_DATA")) {
      //update adapter from here
    }
  }
} 

【讨论】:

    【解决方案4】:

    在您的活动中注册BroadcastReceiver。在此接收器的onReceive 方法中调用该方法。从你的ServicesendBroadcast 到这个接收者,记得将所需的数据添加到你的意图中,并从 onReceive 方法意图中获取数据。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多