I'm stuck at the development of our app. I want to receive the BOOT_COMPLETED broadcast so I can reschedule some Alarms. So I start my app, schedule the alarms and then reboot my device (Android 10). Everything works as expected, ie after reboot, my BroadcastReceiver is started and my alarms are rescheduled.
But if I stop my app before reboot (ie not just put it in background, really kill it), it doesn't receive the BOOT_COMPLETED broadcast anymore ...
I have the respective permissions in my manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
I have the receiver in my manifest enabled with the respective actions
<receiver
android:name=".receivers.CustomBroadcastReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
android:enabled="true"
android:exported="true"
android:directBootAware="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
And this is my CustomBroadcastReceiver class
class CustomBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d(javaClass.simpleName, "onReceive ${intent.action}")
... //reschedule alarms read from SQLite
}
}
I can see the respective Log message after reboot, when the app was running before reboot. But I don't see the log, when the app was killed before the reboot ... Anything I'm missing here?
Yes, I'm aware, there are many other questions regarding BOOT_COMPLETED but they all more or less say, do it like shown above, then it will work. And, well, I know it in principle does work, because I see the receiver being called. But just not, when the app was once killed. If I start the app manually, put it in background and reboot the device, it works as expected ...
Use JobScheduler instead of alarms for this. JobScheduler jobs can be set as persistent across boot, so you don't have to do the bootup wiring yourself.
Related
i am actually working on alarm app that set alarm ans store alarm data into room database,i want to Re Schedule my alarms after the phone reboot.
all work fine but its not working on android 11.In android 11 the boot reciver not trigger and in other devices boot receiver trigger and set all the alarm stored in database
thanks
i am using this code
override fun onReceive(context: Context?, intent: Intent?) {
if (Intent.ACTION_BOOT_COMPLETED == intent?.action)
{
}
}
I hope you have set the below permission
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
and added the intent filter for your receiver like below
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
If the above things are in place. Then try the below things as well
Click on the app after installing your app as until your app is enabled you won't be able to receive BOOT COMPLETE action
Check the condition like below
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()))
In Android 11 you need to open your app after restarting to receive Boot_Complete_receiver
I'm a bit new so I have a simple question, I have created a Xamarin.Android app and I have used local notifications with alarm manager, broadcast receivers, etc to schedule them, the problem that I have is that my scheduled notifications are not being showed when the device is rebooted, or completely off state and turn on again. My questions are:
Is that a problem inside Android?
otherwise
How can I solve it?
I hope help, thanks
By default, all alarms are canceled when a device shuts down.
https://developer.android.com/training/scheduling/alarms
By default, all alarms are canceled when a device shuts down. To prevent this from happening, you can design your application to automatically restart a repeating alarm if the user reboots the device. This ensures that the AlarmManager will continue doing its task without the user needing to manually restart the alarm.
You need to monitor for BOOT_COMPLETE and re-set your alarms.
https://developer.android.com/reference/android/Manifest.permission.html#RECEIVE_BOOT_COMPLETED
Manifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".SampleBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
Receiver:
class SampleBootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == "android.intent.action.BOOT_COMPLETED") {
// Re-set the alarm here.
}
}
}
I am using following code to get location on/off event.
<receiver
android:name=".receivers.GpsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
I am developing geofence based app. Based on Re-register geofences only when required we have to re register the geofences after the app has received a GEOFENCE_NOT_AVAILABLE alert. This typically happens after NLP (Android's Network Location Provider) is disabled.
By using this broadcast receiver I re-registered the geofences when Android's Network Location Provider is enabled.
But from API level 26 this broadcast receiver will never work. See
Background Execution Limits.
So how can I achieve the same task in API 26 and higher?
Note : I need to re-register the geofences even when app is in the background.
You could switch to registering you receivers dynamically by Context.registerReceiver(), but IMHO there is no reliable way to get them registered "forever", because the system is going to terminate your process anyway on certain conditions.
Sure, you could re-register them by using e.g. white listed broadcast receivers, AlarmManager, JobScheduler etc. But this is not the best way in terms of battery and other resource consumption. Actually this is the reason, why Google disabled the implicit broadcasts.
The point is: By disabling implicit broadcasts in Oreo Google forces you to use some kind of recurring job to to do things like this. As the result, you don't need to listen for the NLP state updates, you just set your geofences with GeofencingClient.addGeofences (if NLP is enabled) in your recurring job over and over again.
as mentioned in the article you've linked, there's no way on Android API 26 to listen to implicit broadcasts like
<action android:name="android.location.PROVIDERS_CHANGED" />
if the app is killed or isn't currently running in background.
The only thing what you can do is to register the broadcast receiver on runtime, as stated in the migration guide.
What I did is calling registerReceiver in the application class in onCreate and unregister it in onTerminate.
class MyApplication : Application() {
private val gpsReceiver = MyBroadcastReceiver()
override fun onCreate() {
super.onCreate()
registerReceiver(gpsReceiver, IntentFilter("android.location.PROVIDERS_CHANGED"))
}
override fun onTerminate() {
super.onTerminate()
unregisterReceiver(gpsReceiver)
}
}
Hopefully, this could help you!
maybe you should try use background service and wakelock for long-running in the background when app closed/killed or screen off.
it's works for me :)
I am making a system app. In that I have a requirement is to run a service after boot load WITHOUT A SINGLE TIME LUNCHING THE APP.
this question is bit similar to this
System App auto starting
But it does not have any appropriate solution.
Also read that BOOT_COMPLETE_RECEIVER works only when app launched at once.
Use Broadcast Receiver for getting action after that start service from that broad cast receiver and use START_STICKY service so that if it is killed because of some priority than it's recreate and if you want to continuously run this service in background than WAKE_Lock that service and using Alarm Manager check it is runnig or not.
Set this in manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name="AutoStart"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
AutoStart class
public class AutoStart extends BroadcastReceiver {
#Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {
// Start your service here..
}
}
}
Thanks all for your effort, I finally got answer.
Solution:
As I stated my app is system app, System work even they not opened at once. Because they are not in stopped state i.e enforce after android 3.1.
Secondly If a user app wants this then Its manifest don't have any "android.intent.category.LAUNCHER" category in activity.
Also by adb you can enable your app by using this command
adb shell am broadcast -a com.example.demo.action.LAUNCH --include-stopped-packages (This is not tested)
Some good link to this:
http://droidyue.com/blog/2014/01/04/package-stop-state-since-android-3-dot-1/
Static BroadcastReceiver not Working after Installation from ADB
In my application the user has set some reminders and I have to alarm them when the time has come. Currently I'm using AlarmManager.RTC as a type of AlarmManager
am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent);
it in working as per instruction
// Sets an alarm - note this alarm will be lost if the phone is turned
// off and on again
is there any way the I can fire missed alarms when I turn on the device?
Please note that I don't want to wakeup the device, I just wanted to remind them when they turn on the device.
PS: I have read the documentation http://developer.android.com/reference/android/app/AlarmManager.html#RTC, but I didn't find my option.
is there any way the I can fire missed alarms when I turn on the device?
Step #1: Have some way of tracking, yourself, what is missed, such as by tracking event status in a database.
Step #2: Set up a BOOT_COMPLETED BroadcastReceiver to find when the phone is rebooted. In there, schedule any alarm(s) that are still in the future, and decide what to do about alarms that occurred in the past but were missed (e.g., raise a Notification pointing out the missed events).
You would have to do this manually.
One way to do this would be to listen for the phone shutdown event:
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
and before the device shuts down, save the shutdown time.
Then listen for device bootup:
<action android:name="android.intent.action.BOOT_COMPLETED" />
and write your own logic that determines which alarms would have fired during that downtime, and fire those alarms immediately with AlarmManager.
AlarmManager will alarm all of your alarms till your phone is on.
Registered alarms are retained while the device is asleep (and can
optionally wake the device up if they go off during that time), but
will be cleared if it is turned off and rebooted.
Now that only way fits is to kepp tracks through database.
Put an additional class that extends BroadcastReceiver. Where in its OnReceive() method you can re-generate your alarms when device reboots. (obviously if you have some track, i.e database).
Setting BroadcastReceiver for your purpose can be seen here How to start an Application on startup?.
Hope this helps.
Register broadcastReceiver in your Manifest.xml
<receiver
android:name=".AlarmRestartReceiver"
android:enabled="true">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
After this, listen event when device wake up.
override fun onReceive(context: Context, intent: Intent?) {
if (intent?.action == "android.intent.action.BOOT_COMPLETED") {
// re-register all alarm here..
}
}