Cover photo
Bhupal Sapkota
Works at Semicolon Developers Network
Attended Tribhuvan University
Lives in Kathmandu, Nepal


Bhupal Sapkota

Shared publicly  - 
"How should I design my Android application? What kind of MVC pattern should I use? What should I use for an event bus?"

We often see questions from developers that are asking from the Android platform engineers about the kinds of design patterns and architectures they use in their apps. But the answer, maybe surprisingly, is we often don't have a strong opinion or really an opinion at all.

Should you use MVC? Or MVP? Or MVVM? I have no idea. Heck, I only know about MVC from school and had to do a Google search to find other options to put here.

This may be surprising, because Android could feel like it has strong opinions on how apps should be written. With its Java language APIs and fairly high-level concepts, it can look like a typical application framework that is there to say how applications should be doing their work. But for the most part, it is not.

It is probably better to call the core Android APIs a "system framework." For the most part, the platform APIs we provide are there to define how an application interacts with the operating system; but for anything going on purely within the app, these APIs are often just not relevant.

That said, the Android APIs can often look different (or higher level) from what one typically expects in an operating system, which may easily lead to confusion about how they should be used.

For an example of this, let's consider how an operating system defines "how to run an app." In a classic system, this is basically the contract it has with an application about when it should run:

int main(...) {
// My app goes here!

So the operating system starts the app, calls its main() function, and the app goes off and runs and does what it wants until it decides it is done. And clearly it is not saying anything here about what the app should be doing or how it should be designed within that main function -- it's a pretty pure blank slate.

In Android, however, we explicitly decided we were not going to have a main() function, because we needed to give the platform more control over how an app runs. In particular, we wanted to build a system where the user never needed to think about starting and stopping apps, but rather the system took care of this for them... so the system had to have some more information about what is going on inside of each app, and be able to launch apps in various well-defined ways whenever it is needed even if it currently isn't running.

To accomplish this, we decomposed the typical main entry point of an app into a few different types of interactions the system can have with it. And these are the Activity, BroadcastReceiver, Service, and ContentProvider APIs that Android developers quickly become familiar with.

These classes may look like they are telling you how the internals of your app should work, but they are not! In fact, they are all about how your app needs to interact with the system (and how the system can coordinate its interaction with other apps). As long as that interaction with the system happens, we don't really care what goes on inside of the app.

To illustrate, let's briefly look at these different APIs and what they really mean to the Android system.


This is the entry into an application for interacting with the user. From the system's perspective, the key interactions it provides with the app are:

• Keep track of what the user currently cares about (what is on screen) to ensure the process hosting that is kept running.
• Know that previously used processes contain things the user may return to (stopped activities), and thus more highly prioritize keeping those processes around.
• Help the application deal with the situation where its process is killed so the user can return to activities with their previous state restored.
• Provide a way for applications to implement user flows between each other, coordinated by the system. (The most classic example here being share.)

What we don't care about:

Once we have gotten in to this entry-point to your UI, we really don't care how you organize the flow inside. Make it all one activity with manual changes to its views, use fragments (a convenience framework we provide) or some other framework, or split it into additional internal activities. Or do all three as needed. As long as you are following the high-level contact of activity (it launches in the proper state, and saves/restores in the current state), it doesn't matter to the system.


This is a mechanism for the system to deliver events to the application that may be outside of a regular user flow. Most importantly, because this is another well-defined entry into the app, the system can deliver broadcasts to apps even if they aren't currently running. So, for example, an app can schedule an alarm to post a notification to tell the user about an upcoming event... and by delivering that alarm to a BroadcastReceiver of the app, there is no need for the app to remain running until the alarm goes off.

What we don't care about:

Dispatching events within an app is an entirely different thing. Whether you use some event bus framework, implement your own callback system, whatever... there is no reason to use the system's broadcasting mechanism, since you aren't dispatching events across apps. (In fact there is good reason not to -- there is a lot of unnecessary overhead and many potential security issues if using a global broadcast mechanism for the internal implementation of an app.) We do provide the LocalBroadcastManager convenience class that implements a purely in-process intent dispatching system with a similar API to the system's APIs, if you happen to like them. But again, there is no reason to use that over something else for things going on purely within your app.


A general-purpose entry point for keeping an app running in the background for all kinds of reasons. There are actually two very distinct semantics services tell the system about how to manage an app:

Started services are simply telling the system to, for some reason, "keep me running until I say I am done." This could be to sync some data in the background or play music even after the user leaves the app. Those also represent two different types of started services that modify how the system handles them:

• Music playback is something the user is directly aware of, so the app tells the system this by saying it wants to be foreground with a notification to tell the user about it; in this case the system knows that it should try really hard to keep that service's process running, because the user will be unhappy if it goes away.

• A regular background service is not something the user is directly aware as running, so the system has more freedom in managing its process. It may allow it to be killed (and then restarting the service sometime later) if it needs RAM for things that are of more immediate concern to the user.

Bound services are running because some other app (or the system) has said that it wants to make use of the service. This is basically the service providing an API to another process. The system thus knows there is a dependency between these processes, so if process A is bound to a service in process B, it knows that it needs to keep process B (and its service) running for A. Further, if process A is something the user cares about, than it also knows to treat process B as something the user also cares about.

Because of their flexibility (for better or worse), services have turned out to be a really useful building block for all kinds of higher-level system concepts. Live wallpapers, notification listeners, screen savers, input methods, accessibility services, and many other core system features are all built as services that applications implement and the system binds to when they should be running.

What we don't care about:

Android doesn't care about things going on within your app that don't have any impact on how it should manage your process, so there is no reason to use services in these cases. For example, if you want to start some background operation to download data for your UI, you should not use a service for this -- it is actually important to not be telling the system to keep your process running while doing this, because it really doesn't need to be and the system would be better off having more freedom in managing it with other things the user is doing.

If you just make a simple background thread (or whatever non-service mechanism you want) to do the downloading, you will get the semantics you want: while the user is in your UI, the system will keep your process running for that, so the download will never be interrupted. When they leave your UI, your process will still be kept around (cached) and able to continue downloading, as long as its RAM isn't needed elsewhere.

Likewise for connecting different parts of your app together, there is no reason to bind to a service that is running in the same process as the one binding to it. Doing so is not actively harmful -- the system just sees a dependency from the process to itself so doesn't try to keep it around any more than usual -- but it is a bunch of unnecessary work for both you and the system. Instead, you can just use singletons or other normal in-process patterns for connecting pieces of your app together.


Finally, the ContentProvider is a fairly specialized facility for publishing data from an app to other places. People generally think of them as an abstraction on a database, because there is a lot of API and support built in to them for that common case... but from the system design perspective, that isn't their point.

What these are to the system is an entry-point into an app for publishing named data items, identified by a URI scheme. Thus an app can decide how it wants to map the data it contains to a URI namespace, handing out those URIs to other entities which can in turn use them to access the data. There are a few particular things this allows the system to do in managing an app:

• Handing out a URI doesn't require the app remain running, so these can go all over the place with the owning app being dead. Only at the point where someone tells the system, "hey give me the data for this URI" does it need to make sure the app owning that data is running, so it can ask the app to retrieve and return the data.

• These URIs also provide an important fine-grained security model. For example, an application can place the URI for an image it has on the clipboard, but leave its content provider locked up so nobody can freely access it. When another app pulls that URI off the clipboard, the system can give it a temporary "URI permission grant" so that it is allowed to access the data only behind that URI, but nothing else in the app.

What we don't care about:

It doesn't really matter how you implement the data management behind a content provider; if you don't need structured data in a SQLite database, don't use SQLite. For example, the FileProvider helper class is an easy way to make raw files in your app available through a content provider.

Also, if you are not publishing data from your app for others to use, there is no need to use a content provider at all. It is true, because of the various helpers built around content providers, this can be an easy way to put data in a SQLite database and use it to populate UI elements like a ListView. But if any of this stuff makes what you are trying to do more difficult, then feel free to not use it and instead use a more appropriate data model for your app.
69 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
This is why we love being part of this amazing global Google's Developers Community, its a big family. Thank you APAC regional DevRel team for the support and prayers.

These shirts are made by GDG Vietnam are available here

#gdg   #family #apac   #kathmandu     #nepal      #earthquake  
4 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Crisis Map for Nepal Quake ( plz help the way you can. Started by 
Crowdsourced map of camp sites, crisis areas, and relief drop zone areas in relation to Nepal Quake. As of 27 April, the Government reports 3,351 deaths and 6,833 injured people. 8 million people in 39 districts have been affected, of which over 2 million people live in the 11 severely affected districts. Priority needs include food, water, shelter and medication. Over 1.4 million people are in need of food assistance. A Humanitarian Stagin...
2 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Report stuffs like earthquake damages, people trapped, blocked roads, shelt...
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Women Techmakers Kathmandu event will feature a Interactive Q/A with industry expert and professionals, Mobile apps prototyping workshop, Speaker session from female technology leaders and other guests , Q/A sessions, fun times, networking opportunities, and more.

GDG Kathmandu invite you to attend Women Techmakers Kathmandu events from the following link.
Registration form:
Community URL:

Registration Closes On:
March 25th

Registration Confirmation email will be sent by March 26th
Target Participants: 25 women
Women Techmakers Kathmandu, Nepal
Sat, March 28, 2015, 10:00 AM GMT+5:45
Trade Tower Nepal

2 comments on original post
Rahul Chudhary's profile photo
nepali moves
Add a comment...

Bhupal Sapkota

Shared publicly  - 
A melody. A meaning. Found this gem out of my kid's interest. No reasons not to accept the fact that music touches ppls irrespective of the origin.

Song: My Three Precious
Year: ~1994
Composed By: Bu Ren Ba Ya Er


Daughter: Papa
Dad: Yeah
Daughter: Does the moon go home after the sun’s rising?
Dad: Oh, yep
Daughter: Then where is the sun after stars’ appearing?
Dad: Oh, in the sky
Daughter: But why can’t I find them?
Dad: Oh, they’ve all gone home
Chorus:The sun, the star and the moon, what a happy family they three are!

Mum: Yeah
Daughter: When will the flowers bloom since the leaves are green?
Mum: Oh, in summer
Daughter: Can we pick the fruits since the flowers are red?
Mum: Oh, in autumn
Daughter: Will the seeds bud when they are planted?
Mum: Oh, they will grow
Chorus:The flower, the leaf and the fruit, what a happy family they three are!

Dad & Mum:Honey
Daughter: Yep
Dad & Mum:Papa is like the sun shining on Mama
Daughter: How about Mama
Dad & Mum:Mama is like the leaves holding up the flowers
Daughter: Then me
Dad & Mum:You are just like the budding seed
Daughter: Oh, yep
Chorus: What a happy family we three are!

Chandman Erdene (My Three Precious) 吉祥三宝 - 布仁巴雅尔 / 乌日娜 / 英格玛:
 ·  Translate
prabhat man Shrestha's profile photo
liked the translation and the song. :D
Add a comment...

Bhupal Sapkota

Shared publicly  - 
गुगल'ले राखिदियो, सगरमाथालाई स्ट्रिट भ्यु'मा ।
अब जाने हैन त खुम्बु क्षेत्रको भर्चुअल ट्रेक'मा? #Everest   #Nepal   #StreetView  
 ·  Translate
गुगल स्ट्रिट भ्यु'मा खुम्बु क्षेत्रको लुक्ला, नाम्चे बजार, थामे, खुम्जुङ, फोर्चे आदि क्षेत्र र त्यस क्षेत्रमा भएका विभिन्न सम्पदाहरुलाई समेटिएकोछ । जाने हैन त खुम्बु क्षेत्रको भर्चुअल ट्रेक'मा?
3 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Add a comment...

Bhupal Sapkota

Shared publicly  - 
बिर्सेको कुरो  भिझेको केशमा तिमी नजिक आएका पल, चिसो गला र ती नरम केशबिच म अल्झेका पल, तिमीलाई नौलो झनझनाहट दिने, र मलाई लठ्याएर मन्त्र मुग्द पार्ने  तिम्रो त्यो कस्तूर मैले बिर्सेंछू । 
 ·  Translate
'manasha' ... feelings for a moment i hold and see, for a moment i pause and listen.. an expression of the experience of 'a moment'.. more. Friday, June 19, 2015. birsana. बिर्सेको कुरो. भिझेको केशमा तिमी नजिक आएका पल,. चिसो गला र ती नरम ...
prem subedi's profile photo
Imagination may be correct what you think. But containt of every such imagination displaying in public domain do not decore a desand pepole.
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Trello - recommended tool for any team or a solopreneur who likes to keep things organized.
#Materialdesign helps collaborative planning app Trello improve user engagement on Android. See how they have streamlined the design process and grow their app business using material design. #GooglePlay #AndroidDevStory
12 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
The wait for the sleekest and ad-free Loadshedding App for Android is over! Presenting Batti Aayo!, the sexiest load shedding App ever with tons of awesome features!! Try it today!
2 comments on original post
Add a comment...

Bhupal Sapkota

Shared publicly  - 
Awsm ! Interestingly the Google Inbox app has around the same downloads.
First Nepali app to secure more than 1M downloads in Google Play Store. Congratulations to the developer of Hamro Patro. True to their saying: A single app for all Nepali. This gives all apps developers in Nepal an idea of the achievable stats to aim for when building apps for Nepalese audience worldwide. 

Download Now:

#nepal   #apps   #gdg   #android   #stories   #startups   #kathmandu  
2 comments on original post
Add a comment...
सेमिकोलन भ्यालीको चरो !
Bragging rights
Built & launched first Node.js product in Nepal (
  • Tribhuvan University
    Computer Science, 2005 - 2009
Basic Information
  • Semicolon Developers Network
    Chief Technology Officer, 2010 - present
  • GDG Kathmandu
    Community Manager, 2011 - present
  • OWASP Nepal
    Chapter Lead, 2011 - present
Map of the places this user has livedMap of the places this user has livedMap of the places this user has lived
Kathmandu, Nepal
Chitwan, Nepal - San Francisco, CA
Bhupal Sapkota's +1's are the things they like, agree with, or want to recommend.
Aakar Post – Android Apps on Google Play

The Aakar Post app is the best way to get the latest updates on startup, social media, and tech scene in Nepal. The FREE, custom designed fo

Theatre Hub

heatre Hub is an initiation to provide theatre professionals and enthusiasts across the world a platform to share their experiences and prom


3 things 11beep gives you : #nodigitaltrail #anonymity and #privacy. Bonus: #noadsA specially designed only for mobile social network which

Pocket Code

Create and Play! [Update: now with intro and tutorials at and ] Pocket Code allows you to - Nepali Network is complete Nepali social network or community.You are just a click away from making new friends and reconnecting with old ones

Link Bubble

★★★ "I’m tempted to call this something of a revelation." - The Next Web ★★★ ★★★ "This app may very well change the way I browse the web on

GDG Pokhara

Google Developer Group (GDG) - Pokhara

Leaving Google

As of March 17th I’ll be an ex-employee. It’s an amicable separation in the face of irreconcilable differences: I wouldn’t move to Californi

Nagarik News

Established in 2009, Nepal Republic Media (NRM) Private Limited has become one of the leading and most respected media houses in the country

The Impossible Quiz!

NOW FREE!!!The internet sensation with over 60 million plays is now available in your pocket, anywhere!inXile's Sparkworkz, creators of Line


We have brought to you something which we think you will enjoy using it. It is a beta version of a mobile app which will help take loyalty p

Nepali FM-Calendar-Hamro Patro

Introducing a unique Nepali Calendar so that you don't have to miss any important events, festivals, and rituals. We believe you should be i


Con la nueva aplicación Google Maps para teléfonos y tablets Android, navegar por el mundo es aún más fácil y rápido. Descubre los mejores s

Google Community Translation

The resource you requested is not available. Please click on the 'Products' link above and choose a different product from the ones availabl

OpenGL Demos

This is a port of NeHe's OpenGL tutorials for the Android platform, with specific customizations for touch screens. This app is primarily in

Temple Run: Oz

The most thrilling running experience now comes to the yellow brick road! Reached No. 1 across the globe within hours of launch! Check out a

Intern Story: Begining Android Development (first hand experience)

Semicolon developers network pvt. ltd. is an Android and web application development company in Kathmandu, Nepal. We can be your next IT dev

Crowded. No wifi.
Public - 10 months ago
reviewed 10 months ago
Public - 10 months ago
reviewed 10 months ago
35 reviews
Public - 10 months ago
reviewed 10 months ago
Public - 10 months ago
reviewed 10 months ago