2013-02-22 5 views
5

Grundsätzlich habe ich eine Main-Klasse, die das gesamte Projekt ausführt. Der Code funktioniert einwandfrei, wenn die App jedoch nicht fokussiert ist, wird sie inaktiv. Ich habe mich gefragt, wie ich es machen würde. Eine, die beim Booten gestartet wird.aSmack als Service

Die App wird ein Einweg-Nachrichtensystem für Benachrichtigungen sein. I.E.

Desktop Client -> Openfire Server -> Android XMPP Service -> Storage (DB) -> Android GUI zur Anzeige

Wie ich gesagt habe, wird der Code arbeiten (Connect, Login, Receive) aber isn Es ist ein Dienst.

Ich könnte die BEEM-Quelle verwenden, aber es ist zu funktionsfähig und interlaced. Ich bin nach einem leichten Service.

Der Code:

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

Also im Grunde, Wie mache ich dies ein Service

Antwort

1

Sie müssen die Android Service Framework.

Check-out nutzen könnte GTalk SMS Quelle, da sie einen Dienst nutzen und ist Open Source. (Hauptdienst ist der Dienst, den sie verwenden, um die Verbindung usw. zu handhaben), obwohl es auch sehr kompliziert ist.

Ich würde Ihnen wärmstens empfehlen, die Grundlagen der Nutzung eines Dienstes in Android zu überprüfen.

Erinnern Sie sich daran, dass ein Dienst keinen neuen Thread erstellt, alles noch auf dem UI-Thread ausgeführt wird. Wenn Sie also lange laufende Aufgaben im Hintergrund ausführen möchten, müssen Sie auch einen Asynctask- oder Executor-Dienst implementieren.

0

Alte Frage, aber ich werde meine Antwort sowieso setzen.
Sie müssen einen Dienst erstellen, starten und den Code der aSmack-Verbindung in den Dienst und nicht in eine Aktivität einfügen. Der Dienst behält die Verbindung auch dann bei, wenn die App nicht im Vordergrund ist. Ich verwende diese Methode in einer meiner Kunden App und es funktioniert großartig.

Stellen Sie außerdem sicher, dass Sie einen Handler oder AsyncTask im Dienst verwenden, um die Socket-Verbindung in einem anderen Nicht-UI-Thread zu erstellen. Android erlaubt dir nicht, die Verbindung im UI-Thread trotzdem zu erstellen.

Verwandte Themen