I currently have 2 apps in the market, let's call them app A and app B.
When a certain function is executed in app, I need something to trigger an event in app a, even if app a isn't currently running. I assume app B would send a broadcast message to app a and app a would need a broadcast receiver but I am not sure how this can be done, if it can be done.
There are basically two ways afaik:
Broadcast Receiver and using the sendBroadcast method on the sender side
or by using Intents:
you can use startActivity(Intent) even with another app, but this will bring the app to foreground rather than doing a job in background.
Use intents if the calling app should dissappear and the called app should be in foreground and use broadcasts if you just want a background task performed by another app
Can be done, even if the app isn't running, with BroadcastReceiver, just like you said.
Related
Basically, we've got a bunch of sdks and whatnot that start up in the app's oncreate code.
However, even if the app is force closed, android will boot up the oncreate just to show a push notification.
I'm trying to switch code paths based on whether or not the app was actually launched or if the app was just kicked awake by a service or receiver.
While I know I can use the intents for this, because it happens in a background, I can't actually get an intent from an activity to determine this.
I want to know the difference between services and broadcast receivers, can anyone point out an example that can be observed on android mobile devices.
Thanks
Service: If you want to do something in background , this will be running always in background even if the application closed. You can create this in separate process and also you can give your service to other app if you want. Downloading any content or Music is good example
Broadcast Reciever: Usually system will send some info which can be recieved by your app if you would wish to ,by registering. And you can do something what you want when that thing happens by using onReceive method.
Example is the system will send BroadcastReceiver when new sms arrives or Booting done
Here is good article : Service and BroadcastReceiver
Service is used when you want to do something in background, any long running process can be done using Service in Background. For example, you want to play music when your application gets close. In that case service will be running in background with music.
Example of Service
BroadcastReceiver is used when you want to fire some stuff or code during some event. For example, event can be on Boot of Device. If you want to perform something when device Boots, date and time changed etc...
Example of BroadcastReceiver
I think of it possibly a different way. A Service receives intents that were sent specifically to your application, just like an Activity. A Broadcast Receiver receives intents that were broadcast system-wide to all apps installed on the device.
(The reason I say a Service is a bit like an Activity is that: You wouldn't broadcast a message saying "start Activity MyActivity" across all apps installed on the device. It is only for your specific app.)
Of course, as others mentioned, a Service can continue running in the background, whereas a Broadcast Receiver should finish quickly (e.g. if it is running for more than 5 seconds it may be killed by the OS). The Broadcast Receiver can still run in the background (when app is closed) under certain circumstances. For this, it's worth mentioning that there are actually two types of Broadcast Receivers - Manifest-declared, and Context-registered. They have different lifespans and restrictions - the former can receive broadcasts in the background with certain restrictions, while the latter cannot receive broadcasts in the background (app must be running and active) but has no restrictions on the types of intents that can be received.
Both services and broadcast receivers must be specifically invoked (via an intent), but for services this is usually a specific call (e.g. when your app is started or when the user clicks some button) whereas for broadcast receivers they don't need to be explicitly started as they will start anyway when a relevant broadcast is made.
Here's how I would think of it:
Type
Displays UI?
Can continue running for a long time when app is closed?
Can receive intents when app is closed?
Intents must specifically target your app?
Restricted list of intents that can be specified?
Activity
Yes
No
Yes
Yes
No
Service
No
Yes
Yes
Yes
No
Manifest-declared Broadcast Receiver
No
No
Yes
No
Yes1
Context-registered Broadcast Receiver
No
No
No
No
No
1: Only if you target Android 8.0 or above. The restrictions are not applied if the intent specifically targets your app. The restricted list of intents can be found here.
I have a app which is a single activity app , it listens to many broadcast event , my question is that how can I ensure that I receive all the fired intent which i have added for my app even when my app is not in foreground and running in background ??
is there a certain method where
I should add my intent filter and
do the registerReciever ? I'm sure
it won't work if I keep it in
"Oncreate"
any ideas or help ??
It sounds like you want to be using a BroadcastReceiver to pick up the events when you are in the 'background'. This will pick up events which are actually broadcast without having to launch a UI.
You can set up the BroadcastReceiver and its intent filters in the manifest for your application, this way you dont have to rely on any java code being run to register the receivers.
I have an app on Android that reacts to incoming calls.
Now, since the OS shuts my app down whenever it want,
I need a way to to listen to the incoming calls and launch the app when it happens.
Will a BroadcastReceiver help? (just like launching on device restart)
Any idea?
thanks!
I think you have answered your own question. This is just the sort of thing a broadcast receiver is meant for. If the receiver is registered in your manifest then the application does not have to be running.
It will be automatically started when a matching intent is broadcast. Typically the response will be to update content or activities, make notifications with the Notification manager or launch/manipulate services.
Note that there is a 5 second execution limit in the BroadcastReceiver onReceive handler to ensure you do not try to do any 'heavy lifting' in it. Exceed this and a force close dialog will be displayed.
Yes a BroadcastReceiver would to the job as it will fire even you app is not running.
I want to run some code when an app is launched, so my broadcast receiver has to be notified when user open any app.
Is there any way to do it?
No, sorry, there are no Intents broadcast when an application is started, nor when an activity is started.
Probably you can have some trigger from a method like onCreate etc which would be the first method to be hit whenever your app is launched.
This is possible using accessibility services. An event AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED is recieved when the foreground activity is changed. The package name of the app in the foreground can be obtained from within the callback.
I have provided the code snippet in the answer to a similar question here.
How to monitoring app swaping in foreground?
The complete code for sample app to get the foreground process name is also available at https://github.com/abinpaul1/Android-Snippets/tree/master/GetForegroundService