2013-02-22 18 views
5

Zasadniczo mam główną klasę prowadzącą cały projekt. Kod działa doskonale, ale gdy aplikacja jest nieostra, staje się nieaktywna. Zastanawiałem się, w jaki sposób chciałbym zrobić z tego usługę. Jeden, który uruchamia się przy starcie.aSmack as a service

Aplikacja będzie jednokierunkowym systemem komunikatów dla powiadomień. TO ZNACZY.

Pulpit Client -> Openfire Server -> Android XMPP Service -> Storage (DB) -> Android GUI dla wyświetlacza

jak mówiłem, Kodeks pracuje (Connect Login, odbiór) ale ISN Usługa.

Mogę użyć źródła BEEM, ale jest zbyt polecane i z przeplotem. Jestem po lekkiej służbie.

Kod:

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

Więc zasadniczo Jak zrobić to usługa

Odpowiedz

1

Trzeba korzystać z Android Service Framework.

Mógłbyś sprawdzić GTalk SMS źródło, ponieważ wykorzystują usługę i jest open source. (Usługa główna jest usługą, której używają do obsługi połączenia itp.), Chociaż jest również bardzo skomplikowana.

Gorąco polecam zapoznać się z podstawami korzystania z usługi w systemie Android.

Pamiętaj, że usługa nie tworzy nowego wątku, wszystko jest nadal wykonywane w wątku interfejsu użytkownika, więc jeśli chcesz wykonywać długie zadania w tle, musisz również zaimplementować usługę asynktaksu lub executora.

0

Stare pytanie, ale i tak ułożę odpowiedź.
Musisz utworzyć usługę, uruchomić ją i umieścić kod usługi aSmack w usłudze, a nie w żadnej aktywności. Usługa zachowa połączenie nawet wtedy, gdy aplikacja nie jest na pierwszym planie. Używam tej metody w jednej z aplikacji mojego klienta i działa świetnie.

Upewnij się również, że używasz Handler lub AsyncTask w usłudze, aby utworzyć połączenie z gniazdem w innym wątku innym niż UI. Android i tak nie pozwoli ci utworzyć połączenia w wątku UI.

Powiązane problemy