Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

aSmack as a service

Basically I have a Main class running the entire project. The code is working perfectly although once the App is unfocused it becomes inactive. I was wondering how I would go about making it a service. One that would startup at boot.

The app will be a one way message system for notifications. I.E.

Desktop Client -> Openfire Server -> Android XMPP Service -> Storage (DB) -> Android GUI for display

As I've said, the Code is working (Connect, Login, Receive) but isn't a service.

I could use the BEEM source but it's too featured and interlaced. I'm after a lightweight service.

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

So basically, How do I make this a service

like image 541
Webb Avatar asked Oct 05 '22 23:10

Webb


2 Answers

i guess this example at the given link would give you the idea for making it a service. http://android.codeandmagic.org/small-test-of-asmack-xmpp-client-library/

like image 179
Fallak Asad Avatar answered Oct 10 '22 01:10

Fallak Asad


You need to utilise the Android Service Framework.

You could check out GTalk SMS source as they utilize a service and is open source. (Main Service is the service they use to handle the connection etc. ) though it is also very complicated.

I would highly recommend you check out the basics of utilizing a service in Android.

Remember a service does not create a new thread, everything is still done on the UI thread so if you want to perform long running tasks in the background then you'll also need to implement an asynctask or executor service.

like image 35
James W Avatar answered Oct 10 '22 02:10

James W