Best way to implement Socket.io in android
First of all, the Application's onCreate()
is irrelevant in your use case because you can't have a thread running in the background when it was first initiated in a non service code.
Also, I would recommend using Google Cloud Messaging instead of creating your own mechanism. It would be best for the device's battery life and much less code for you to handle.
If you do want to implement that chat completely on your own, Service
is your only choice. You can also combine it with a singleton, but I wouldn't recommend that approach. You can use broadcasts and BroadcastReceiver
for communicating between your Service
and Activity
, I think it is easier than a Bound Service since bounding to the service is asynchronous and it creates a lot of mess compared to simple broadcasting.
Service for Maintaining socket
connection
As per Ofek Ron mentioned Service
with BroadcaseReceiver
is a better idea than BoundService
. Because its a tedious process to maintain communication. And I also recommend pub/sub
way of broadcasting, like Otto
or EventBus
(I myself suggest Otto by Square, which is clean and brilliant api).
Pros of OTTO
1. Cleaner Api
2. You can subscribe and publish in/to any Activity
, Fragment
, Service
class.
3. Decoupling. (You have to couple as less as possible in your code).
And one more point is use START_STICKY
in the onStartCommand()
to start service after it is getting destroyed. See this reference.
MainApplication to start the service
It's best practice to start the service in the MainApplication
that extends Application
. Because the application will be killed when there is a memory constraint or user forcefully closes the app from the stack. So onStartCommand()
will not be called frequently like if we have implemented in Activity.
Implementing online status
You can implement online status simply by implementing Application.LifeCycleCallbacks
in the MainApplication
class, which has most of the life cycle callbacks of activity and will be notified in the callback. By that you can implement Online
status simply without any boiler plate codes. (If anyone need help here let me know).
Uploading or downloading images or files.
Best practice is to implement by IntentService
because it's running in the a separate thread. I promise which will give the best performance because it is handled by android itself, not like threads created by us.
You can combine first way and third way like:
Create Socket
s in your Application
and declare them as static
. So you can maintain and access them every where in you application. Don't forget to create separate Thread
s to perform the network operations, you can use ThreadPool
to manage those Thread
. If you want to update your UI from those Thread
you can use Handler
and Message
to communication with UI Thread