2013-02-22 24 views
5

Về cơ bản tôi có một lớp Main chạy toàn bộ dự án. Mã hoạt động hoàn hảo mặc dù khi ứng dụng không tập trung thì mã sẽ không hoạt động. Tôi đã tự hỏi làm thế nào tôi sẽ đi về làm cho nó một dịch vụ. Một trong đó sẽ khởi động lúc khởi động.aSmack như một dịch vụ

Ứng dụng sẽ là một hệ thống nhắn một cách để thông báo. I E.

Desktop Client -> Openfire Server -> Android XMPP Service -> Storage (DB) -> Android GUI để trưng bày

Như tôi đã nói, Bộ luật đang làm việc (Connect, đăng nhập, Nhận) nhưng isn không phải là một dịch vụ.

tôi có thể sử dụng các nguồn BEEM nhưng nó quá đặc sắc và xen kẽ. Tôi sau một dịch vụ nhẹ.

Mã:

public class MainActivity extends Activity { 

    public static final String HOST = "fire.example.com"; 
    public static final int PORT = 5222; 
    public static final String SERVICE = "example.com"; 
    public static final String USERNAME = "[email protected]"; 
    public static final String PASSWORD = "mepass"; 

    private XMPPConnection connection; 
    private ArrayList<String> messages = new ArrayList<String>(); 
    private Handler mHandler = new Handler(); 
    private ListView listview; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listview = (ListView) this.findViewById(R.id.listMessages); 
    setListAdapter(); 

    connect(); 
    } 

    /** 
    * Called by Settings dialog when a connection is establised with 
    * the XMPP server 
    */ 
    public void setConnection(XMPPConnection connection) { 
    this.connection = connection; 
    if (connection != null) { 
     // Add a packet listener to get messages sent to us 
     PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
     connection.addPacketListener(new PacketListener() { 
     @Override 
     public void processPacket(Packet packet) { 
      Message message = (Message) packet; 
      if (message.getBody() != null) { 
      String fromName = StringUtils.parseBareAddress(message.getFrom()); 
      Log.i("XMPPChatActivity ", " Text Recieved " + message.getBody() + " from " + fromName); 

      messages.add(message.getBody()); 


      mHandler.post(new Runnable() { 
       public void run() { 
       setListAdapter(); 
       } 
      }); 
      } 
     } 


     }, filter); 
    } 
    } 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@SuppressLint("NewApi") 


    private void setListAdapter() { 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, messages); 
    listview.setAdapter(adapter); 
    } 

    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     connection.disconnect(); 
    } catch (Exception e) { 

    } 
    } 

    public void connect() { 

    final ProgressDialog dialog = ProgressDialog.show(this, "Connecting...", "Please wait...", false); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     // Create a connection 
     ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE); 
     XMPPConnection connection = new XMPPConnection(connConfig); 
     try { 
      connection.connect(); 
      Log.i("XMPPChatActivity", "[SettingsDialog] Connected to "+connection.getHost()); 
     } catch (XMPPException ex) { 
      Log.e("XMPPChatActivity", "[SettingsDialog] Failed to connect to "+ connection.getHost()); 
      Log.e("XMPPChatActivity", ex.toString()); 
      setConnection(null); 
     } 
      try { 
      connection.login(USERNAME, PASSWORD); 
      Log.i("XMPPChatActivity", "Logged in as" + connection.getUser()); 

      // Set the status to available 
      Presence presence = new Presence(Presence.Type.available); 
      connection.sendPacket(presence); 
      setConnection(connection); 

      Roster roster = connection.getRoster(); 
      Collection<RosterEntry> entries = roster.getEntries(); 
      for (RosterEntry entry : entries) { 

       Log.d("XMPPChatActivity", "--------------------------------------"); 
       Log.d("XMPPChatActivity", "RosterEntry " + entry); 
       Log.d("XMPPChatActivity", "User: " + entry.getUser()); 
       Log.d("XMPPChatActivity", "Name: " + entry.getName()); 
       Log.d("XMPPChatActivity", "Status: " + entry.getStatus()); 
       Log.d("XMPPChatActivity", "Type: " + entry.getType()); 
       Presence entryPresence = roster.getPresence(entry.getUser()); 

       Log.d("XMPPChatActivity", "Presence Status: "+ entryPresence.getStatus()); 
       Log.d("XMPPChatActivity", "Presence Type: " + entryPresence.getType()); 

       Presence.Type type = entryPresence.getType(); 
       if (type == Presence.Type.available) 
       Log.d("XMPPChatActivity", "Presence AVIALABLE"); 
       Log.d("XMPPChatActivity", "Presence : " + entryPresence); 
       } 
       } catch (XMPPException ex) { 
       Log.e("XMPPChatActivity", "Failed to log in as "+ USERNAME); 
       Log.e("XMPPChatActivity", ex.toString()); 
       setConnection(null); 
       } 
       dialog.dismiss(); 
      } 
     }); 
    t.start(); 
    dialog.show(); 
    } 
} 

Vì vậy, về cơ bản, Làm thế nào để làm cho một dịch vụ

Trả lời

1

Bạn cần phải sử dụng Android Service Framework.

Bạn có thể kiểm tra GTalk SMS nguồn khi họ sử dụng một dịch vụ và là nguồn mở. (Dịch vụ chính là dịch vụ mà họ sử dụng để xử lý kết nối, vv) mặc dù nó cũng rất phức tạp.

tôi sẽ khuyên bạn hãy kiểm tra những điều cơ bản của việc sử dụng một dịch vụ trong Android. Hãy nhớ rằng một dịch vụ không tạo ra một chuỗi mới, mọi thứ vẫn được thực hiện trên luồng giao diện người dùng vì vậy nếu bạn muốn thực hiện các tác vụ chạy dài trong nền thì bạn cũng sẽ cần triển khai dịch vụ asynctask hoặc dịch vụ thi hành.

0

Cũ câu hỏi, nhưng tôi sẽ đưa câu trả lời của tôi anyways.
Bạn cần phải tạo một dịch vụ, hãy bắt đầu nó và đặt mã của bạn kết nối aSmack trong dịch vụ, không phải trong bất kỳ hoạt động. Dịch vụ sẽ giữ lại kết nối ngay cả khi ứng dụng không ở nền trước. Tôi đang sử dụng phương pháp này trong một ứng dụng của khách hàng của tôi và nó hoạt động rất tốt.

Ngoài ra, hãy chắc chắn rằng bạn sử dụng một Handler hoặc AsyncTask trong dịch vụ để tạo ra các kết nối ổ cắm trong một thread phi UI. Android sẽ không cho phép bạn tạo kết nối trong chuỗi giao diện người dùng.

Các vấn đề liên quan