如何创建服务以下载XMPP联系人?

时间:2013-01-30 09:35:12

标签: android service xmpp

在我的应用程序中,我使用XMPP进行聊天,在此我必须创建一个服务,将所有联系人从XMPP服务器下载到我的数据库。我现在正在做类似下面的代码,它需要很长时间才能获得所有联系人,我没有兴趣用户让我们等待完成下载所有联系人。 由于这个原因,我想使用服务在后台完成这项工作,然后将它们存储在数据库中,如果数据库有新联系人,我将使用提供程序更新联系人。

我知道如何创建服务但是在这里我无法将诸如Roster和XMPP连接之类的参数传递给服务,这些参数是从XMPP服务器下载联系人所必需的。 请任何人指导我如何解决这个问题。 这是我现在使用的代码。

public class GmailXmppClient { 

   public GmailXmppClient(ChatAccountsFragment _fragment, Context _context) {

      this.fragment = _fragment;
      this.context = _context;


      ConnectionConfiguration config = new ConnectionConfiguration(server_host, SERVER_PORT, SERVICE_NAME);
      m_connection = new XMPPConnection(config);
      try {
          m_connection.connect();
      } catch (XMPPException e) {
           e.printStackTrace();
      }
  }

  public Roster getRoster() {
     Log.i(TAG, " getRoster ");
     return m_connection.getRoster();
  }

  public boolean Login(String uname, String pass ) throws XMPPException {

    m_connection.login(uname, pass);     
    this.fragment.Gtalk_logInComplete(uname, m_connection);             
    this.setPacketFilters();
    Presence presence = new Presence(Presence.Type.available);
    Log.i("ID", "" + presence);
    m_connection.sendPacket(presence);      
    return true;
  } 

  public void disconnect() {
     m_connection.disconnect();
  }
}

从此代码后的上述代码

this.fragment.Gtalk_logInComplete(uname, m_connection); 

此代码将运行以从xmpp服务器获取联系人

private void getConts() {

   Roster roster = colors_xmpp_client.getRoster();
   String file_name;
   for (RosterEntry entry : roster.getEntries()) {
     if (entry.getType() == ItemType.to || entry.getType() == ItemType.both) {              

        boolean yes = Contact_data_source.checkUsername(entry.getUser());
        Log.i(TAG, "Con=" + yes);
        if (!yes) {
           String na = entry.getUser();
           String[] me = na.split("@");                     
           Bitmap buddy_img = buddyImage(entry, _connection);
           if (buddy_img != null)
               file_name = Store(buddy_img);
           else
               file_name = "";
           if (entry.getName() == null)
               Contact_data_source.createContact( entry.getUser(), entry.getUser(), Uname, file_name, UsedStrings.SipAccount, me[0] );
           else
               Contact_data_source.createContact( entry.getName(), entry.getUser(), Uname, file_name, UsedStrings.SipAccount, me[0] );
         } else {
          Log.i(TAG, "Con=exist");
         }
      }
    }               
 return null;
}

2 个答案:

答案 0 :(得分:1)

您可以使用以下流程:
1)启动Activity,绑定RosterService

2)向ContentObserver注册所需的上下文(应用程序上下文或活动)     context.getContentResolver()。registerContentObserver(uriRosterChanged,true,contentObserver);

3)将此上下文和contentObserver发送给RosterService

4)在服务中:联系并将其存储到db和!!! >>

5)在服务中:context.getContentResolver()。notifyChange(uriRosterChanged,contentObserver)

6)重复i.4进行下一次接触

i.5 - >将触发contentObserver.onChange方法,所以在这里你可以刷新你的联系人列表

如何通过附加和直接方法调用( setRosterNConnection())描述2发送参数以服务 2种方式 setRosterNConnection()
活动代码:

...
RosterService mService;
@Override public void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = new Intent(this, RosterService.class);
    intent.putExtra("Key", "Value");
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    ...
}
...
Roster mRoster ;
XMPPConnection mConnection;
...
private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className,
            IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();       
        mService.setRosterNConnection(mRoster, mConnection);
        mService.doJob();
    }

    public void onServiceDisconnected(ComponentName arg0) {
                mService = null;
    }
};
...


RosterService 代码:

// some class LocalBinder extends Binder{...} if some needs
private  LocalBinder mBinder = new LocalBinder(); // class LocalBinder extends Binder{...}
...
@Override
public IBinder onBind(Intent intent) {
    Bundle extras = intent.getExtras(); 
    if(extras == null)
        Log.d("RosterService","extras is empty");
    else
    {
        Log.d("RosterService","extras not empty");
        String key = (String) extras.get("Key");
        ...
    }
    return mBinder;
}
...
public void setRosterNConnection (Roster roster , XMPPConnection connection){
...
}
...
public void doJob(){
 // get and save contacts
    ...
}

答案 1 :(得分:0)

也许你可以在AsyncTask中完成它。

AsyncTask只会在另一个线程上完成工作,只要用户关闭你的活动就会停止asyncTask。