Hacker News new | past | comments | ask | show | jobs | submit login
Android vendors, don’t kill my app (dontkillmyapp.com)
515 points by kumaranvpl 3 months ago | hide | past | web | favorite | 402 comments



For our Zombies, Run! run tracking/audio adventure app, "battery management" is turning into our most consistent customer complaint, to the point where it's impacting review scores, active users, and probably subscriptions. The result of the changes made by Huawei, OnePlus, Xiaomi, and Samsung mean that our app is killed during runs, and people interpret that as the app crashing.

We're trying to figure out the best way of telling users how to change their battery settings (which, for the avoidance of doubt, are usually on by default; and sometimes revert back to default on OS updates); some kind of annoying modal popup in the app before they begin a run, perhaps.

What can I say? These Android manufacturers are prioritising numbers they can put on a spec sheet over the end-user experience on entire categories of legitimate fitness and audio apps. We have no recourse and no way to get on their whitelist. Maybe Google could threaten the manufacturers, but that would be a nuclear-level response.

Yet another thing third-party app developers have to deal with.


>We're trying to figure out the best way of telling users how to change their battery settings

The best way to do that is to remotely figure out on which devices the app is getting killed by sending data push notification messages and an in-app ack mechanism. And then show users an annoying popup message the next time they launch to make sure that they whitelist the app. We faced the same problem while building Flock, a team messenger and the details are outlined here.

https://hackernoon.com/notifications-in-android-are-horribly...


Samsung is part of OHA (Open Handset Alliance) & Others have access to Google Play Services; so Google can in-fact ask them to stick to the android specs.

Background services management was let loose in Android till 6.0; with doze mode & Job scheduler it has vastly improved. I think manufacturers shouldn't start killing apps themselves, as shaming apps which abuse background services, eat power inconsistently by displaying notification & allowing user to 'force stop' the app themselves does the job as in OxygenOS.

For all the flak iOS gets regarding multitasking, I was impressed by their uncompromising attitude towards background services from the start, even when I was bashing my head during iOS development to implement features on par with android version. The background operations should be completed within 3 minutes, but there's no guarantee that it will not be killed before that!


> We're trying to figure out the best way of telling users how to change their battery settings (which, for the avoidance of doubt, are usually on by default; and sometimes revert back to default on OS updates); some kind of annoying modal popup in the app before they begin a run, perhaps.

That seems to be exactly what TFA notes in various per-manufacturer segments (the color blocks with poop emoji are clickable and provide manufacturer-specific information and complaints) e.g. for Nokia:

> every [background] process gets killed after 20 minutes regardless it is actually supposed to be running and doing a useful job for the user.

or for OnePlus:

> Not only did users need to enable extra settings to make their apps work properly, but those settings even get reset with firmware update so that apps break again and users are required to re-enable those settings on a regular basis. […] On some OnePlus phones there is also a thing called App Auto-Launch which essentially prevents apps from working in the background.


Would it be possible to detect that the app was killed while engaged in such a situration as yours, i.e. similar how to systemd detects killed apps with a keepalive ping written to the fs while engaged.

Then on the next boot explain that you detected this, and guide the user to OP's page? Or is it way more complicated than so?


As TFA notes (in the Nokia section, possibly others):

> This app kills apps in the most brutal way we have seen so far among Android vendors.

You can't detect that your application was kill -9'd. I don't think you can detect that "PowerSavingAppG3" is running either (I'd guess it's running as root and you're not), so you can't even infer from its existence that your application will be traumatically killed in short order.


I think you are reversing what the parent comment meant. You can continually write to the sandboxed filesystem of your app, say write the current timestamp every 10 seconds, and a status of if the app exited gracefully (which you can control). Then when restarting the app you check if there was a timestamp written in the last say 2 hours and no graceful exit then you know the app was terminated and can explain that the app didn't crash but that the OS vendor force quit it.


Please don't! This will wear out both the battery and the flash memory for no reason. It's exactly this kind of sloppy coding that made these manufacturers decide app killers were necessary.


How do you differentiate an apps crash from an OS forceful kill?

Both would show a last good status and no good exit.


Presumably you would have an error log in the crash circumstance, unless it was very seriously broken.


App crash leaves a crash dump generally. Also, if your app crashes too often on some oems, the phone will automatically clear the local data, to "fix" it. I forget which one did it or I'd shame them directly.


You can detect which model of phone the app is running on, right? On these problematic models you should probably just assume that the app got killed in that circumstance.


Yes, but that's not a detection or even an inference, it's a loose assumption.


Sure you can:

1. Create an empty file when the application launches

2. When the application terminates, write the reason for termination into the file.

3. When the app launches again, read the file. If it was empty, then you were SIGKILL'd, or you crashed.


> you were SIGKILL'd, or you crashed.

"Might have been killed, might have crashed" is not helpful, and the inability to know is the very issue at hand here. You can't know whether your application crashed, the user forcefully killed it or you fell afoul a background killer. What now, do you start spamming the user anyway?


Most of the time when you crash there is a signal associated with that which can be handled. If you application terminated normally under an error case, then that has to be captured through the same mechanism.


Android doesn't offer any signal of normal termination. Your process gets killed when the OS needs memory for some other app.


A kill -9 wouldn't give you a chance to write the reason for termination to a file. It's the equivalent of the OS saying "you have already run your last CPU cycle, you will receive zero more CPU cycles, good bye".

You might be able to write the word "bad" in a file, and then clear the file if your app closes nicely. If you start and find the word "bad" in the file, then you know you were killed. A slight variation of what you suggested.


Which is why the absence of a reason in the file is indication it was killed.


You're right.


That's what the empty file tells you.


There is a way to detect it but it's hacky. You need to use fcm xmpp to send data push notifications with delivery receipts and also send an acknowledgement from the apps background service. Devices where you don't get the app ack have an app which is force killed

Details outlined here : hackernoon.com/notifications-in-android-are-horribly-broken-b8dbec63f48a


That sounds way over-complicated. Why not just keep a flag in the database that's updated during the Activity lifecycle?


Sorry, I didn't understand. We need a service side service to keep track of ack's that we received from the device. I am not able to understand how a db flag would help.


If all you need is to detect it on the next boot to notify the user, as the prior comment said, then for example:

onCreate - check "running" flag, then set to true

onDestroy - set flag to "ended"

If onCreate saw the flag was already "running" before it was set, then you have a crash to recover from or a kill to notify the user about.


Have an app priority defined by user


Whether this is possible or not is deeply missing the point as well as showing a vital misunderstanding about UX.


People were correct to downvote my comment. The tone was all wrong. For some reason, I take Android's many shortcomings as a personal affront. I guess that's what years of being a dev where all the piracy and user support are with Android issues while only returning a fraction of the profit compared to iOS will do to you.

The point is that this is entirely Google's fault and yet it's the devs who have to clear up the mess and take the blame, or alternatively we bombard the users with technical fixes and explanations. Quite clearly neither of these options is where we should be with a mature OS on a mass consumer device.

Now I'm getting all angry again just thinking about it. Time to up my meds.


> as well as showing a vital misunderstanding about UX

The third party controlling your user's experience is forcibly killing your application while it's in use as intended. This somehow means you are misunderstanding UX?

People are suggesting ways to detect it and teach the user how to stop it, because they have no automated solution to this problem.


>a vital misunderstanding about UX.

What misunderstanding would that be exactly? App developer has to find a way to help customers work around an issue they cannot resolve themselves. Seems reasonable to me.


If Play Store allows to mark the app as incompatible with specific models, that might be the best recourse―since the app can't function properly on those phones anyway.


Isn't that basically a death knell - especially if you're not a top 10/50/100 app - when trying to reach customers? If you wait until the customer has downloaded your app, you'll probably have better retention. If you mark your app as incompatible, people won't even bother to install even though there could be a work around. You'd basically be trying to send a message to users about device manufacturers and the Android operating system while killing your own numbers.


Not even that: marking it as incompatible will render the app listing invisible for those devices (in both top lists and searches), and if you do reach the listing directly then the install button will be disabled.

Pulling the nuclear option for something with clear workarounds (or which only impacts peripheral features) is unacceptable.


I don't think it's just that. As an app user I can say I'm tired of apps running in the background that don't need to be, and there are tons of them that do it. Maybe Android needs to be more refined in how it handles apps that run in the background but as a user who prizes control of my phone I also think developers need to think twice about what they leave running in the background and why.


Seems like battery management has the traditional firewall problems.

Eg. Blocking legit services and obscure errors popping up.

Ps. Love zombies run


This is the Android multitasking lead finally coming fully circle. Android had multi tasking much earlier and in a more powerful way by allowing apps to start their own serivices and do pretty much whatever they wanted, but this is the unfortunate logical result - apps that agressively kill other apps, installed by the handset manufacturers, to protect users from badly written apps that drain the battery in the services.

Apple took a lot of flak for not having multitasking, but to they credit they took the time to build explicit APIs that allowed apps to handoff certain whitelisted tasks (audio playback, downloads, alarms, notifications) to the OS, and made clear guarantees about the circumstances under which the APIs would work.


>> "Apple took a lot of flak for not having multitasking, but to they credit they took the time to build explicit APIs that allowed apps to handoff certain whitelisted tasks"

iOS's support for background tasks is still shit. This is why some apps have been abusing the location API to ensure that background tasks don't get killed. Apple deserved all the flak it got and it still does.

_Example 1:_ fetch email (without push) for any non-Apple email app will not work reliably, because the app can get killed. You have to rely on Apple's built-in notification support, but this means that a server-side connection needs to be maintained.

As a result, if you want reliable mail delivery without using Apple's Mail, you have no way but to share your username and password with third-party app servers which you don't trust. For example: Airmail or Canary Mail.

Of course, Apple's own Mail has no such restrictions because it is a special part of the OS. This is no surprise however, since Apple has been actively hostile to alternatives for their own apps.

_Example 2:_ backing up photos and videos (with Dropbox, Google Drive, etc).

There's no way to ensure that your photos get backed up without making an effort to keep the app active, in the foreground, with the screen on, or without the app developer abusing the location API, which Dropbox has been doing.


Example 1 has been solved with Background App Refresh a long time ago [1]

Example 2 should work fine with the background mode declared [2]

Both these APIs are pretty old... is there something I'm missing?

[1] https://developer.apple.com/documentation/uikit/core_app/man...

[2] https://developer.apple.com/documentation/foundation/url_loa...


1. no, does not work — email clients warn users that if the app gets killed then notifications will stop and yes, I tested this quite recently

2. no, it does not work for background uploads, here are screenshots of Dropbox's configuration and Dropbox is not alone in doing this ;-)

Step 1: https://www.dropbox.com/s/b7vylhljg2fwtb8/2019-01-14%2015.02...

Step 2: https://www.dropbox.com/s/c9knz2zz6zs28l5/2019-01-14%2015.04...


Isn't that the same kind of excuse-making you're dinging the Android world for? "OK, fine, the experience sucks by default but it works fine if you just do this and this and this". Android has all those sorts of features too.

It's just a hard problem. App developers are bad, and do bad things. OSes can't protect against all bad behavior. Phone manufacturers do have a vested interest in protecting their users from bad apps. Users do actually benefit from this on balance.


> Users do actually benefit from this on balance.

Users don't benefit from lazy ham-fisted hacks. There is no benefit to killing an app without notifying it in any way, or killing a background app that is using 0.2% of available memory and 0.0% of CPU just because it has been open for a long time.


> There is no benefit to killing an app without notifying it in any way

Sigh. There can be on balance. Bad apps get killed, users don't see as many dead phones. A few false positives get killed too, to great annoyance of their authors (and potentially users, but it's mostly the app authors upset here, be honest).

Whether that's worth it or not depends on the numbers involved, not your personal definition for "ham-fisted" or the existence of a better solution.

All I'm saying is that app vendors aren't the only parties involved here, and that the problem being addressed is real, and quite important.


Can you explain the advantage in killing the app without notifying it? You're going to kill the app because it's consuming 500MB of memory, fine, send it SIGTERM or equivalent and then give it two minutes to orderly shut down before you send SIGKILL. Not doing it that way has a cost and no apparent benefit to "balance" it with.


> Can you explain the advantage in killing the app without notifying it?

Um.. "The app uses less energy." Is that a serious question?

Again you seem to be arguing that there are better ways to solve this problem. There no doubt are. That doesn't mean the existing solution doesn't have value.


> Um.. "The app uses less energy." Is that a serious question?

For the two minutes between when you ask it to shut down and when you kill it? Even assuming that's a meaningful amount of energy savings (probably not), you could just kill it at the same time as you would have regardless but ask it to shut down two minutes before that.

> Again you seem to be arguing that there are better ways to solve this problem. There no doubt are. That doesn't mean the existing solution doesn't have value.

All value is relative. You can make anything sound good by comparing it to something arbitrarily worse, but that doesn't prove anything. Riding a donkey is better than walking on foot but I wouldn't want to have to travel from New York to LA on one.

The question is whether it's better than the good known existing alternatives, not whether it's better than the bad ones.


Background App Refresh has been a thing for ages - It took them a while, but Apple solved this problem in a super user-friendly manner.


No, they haven't solved it.


I’m curious: why doesn’t background refresh solve the problem?


Background refresh doesn't work if the user "force closes" the app, i.e. they go to the task manager and swipe it away. Anecdotally, it's super common for people to do this as they have read somewhere that it helps battery life (not untrue, but also not really effective). So if you were writing an e-mail app you wouldn't be able to guarantee that you'll actually deliver e-mail to users, which feels kind of important.


I see. I can see the issue.

But it comes down to this: if a user explicitly kills an app, should it keep running in the background?

If the answer is "yes", then what you're really saying is users shouldn't be able to kill apps if the app doesn't want to be killed.

I get that some users don't know what killing an app means but do it anyway for some reason.

But that's not a problem with background refresh. E.g., maybe iOS could warn/explain about the implications of killing an app (with a checkbox so you can opt-out of further warnings).

Edit: just realized I left the word “not” out just above, which reverses it’s meaning


The problem is that nothing is self-evident. An app that sends remote notifications to notify you of an e-mail looks exactly the same as one that locally generates a notification as a result of background processing. But the former will work after being swiped away from the app switcher and the latter won't.

I just don't think it's reasonable to expect the average use to "get" that.


I agree the users shouldn’t be the ones worrying about the subtlties. It’s we developers.


Sounds like user error at that point, I would popup a message after the next force quit saying that doing so will pause email notification until the app is reopened.

There you go: bug turned into a feature.


How on earth would that be a feature? If you have to show a popup on launch for something like that then it's a user experience failure, no matter if it's your fault or Apple's. Either way, it means the user has to treat your app differently to every other app on their phone. That is bad.

"It's user error" is a weak excuse if any kind of significant number of users are doing it.


If a user 'force quits' an app, don't they expect that it won't be running in the background receiving app content updates?

If I force quit an app on my computer, it no longer runs and does things.


An app that has been force quit can still receive remote notifications just fine. I don't think the average users knowledge is so nuanced that they understand the distinction between a remotely-sent notification that always appears and a locally generated one that's the result of a background process that doesn't.


I think most users expect to receive notifications from apps (especially communication apps) even if the app doesn't appear in the App Switcher carousel. What people expect from their phones and computers are wildly different here.


The feature in my mind was an easy way to temp silence an app without going into settings.

I still think of it as user error if they force quit an app but still expect it to run in the background. Why force quit it?

I could see how it could be a UX failure for the OS but I don't think we can blame the dev for that. Apple should clarify what force quit does. I think the advent of webapps that don't really exist on your phone at all also causes confusion: the app has been updated with more content each time you use it, even if it's not running in the background, but to the user that's indistinguishable from the app running in the background.


Isn't it also the consequence of taking the control away from the user? Why can't I whitelist which applications I want to allow to run in the background? Why do I still have to grant an application all the permissions it requests when I install it instead of being able to turn them on or off individually?

By dumbing things down that way Google created this situation IMO, it's bad from a quality, usability and privacy perspective. Of course Google considers that you leaking your personal info is a feature so that part probably won't change, but they should at least care about the two other points.


No, it’s the consequence of permitting background tasks at will. Apple took some heat, and there is learning curve associated with doing it their way, but they actually thought it through and created an energy-efficient architecture that addresses common use cases. And apps that don’t fit those use cases - what are they doing with your device?


Can I run XMPP or IRC on an iphone by now or does it still only receive messages when foregrounded?


"Use a bouncer" might be the answer there. All engineering is compromise, and needing a bit more compromise to support legacy applications is not unreasonable.

(In fact, why are you running a stream-oriented application over such an unreliable connection at all?)


My XMPP client works perfectly on my Android phone. Prompt and reliable notifications of new messages. Better than most "Push Message" based clients I've used for other chat services.

It's consistently the last in battery usage as well.

Honestly I don't need the OS to protect me from poorly engineered apps, I just need it to correctly blame the apps so I know which ones to stop using.


>Honestly I don't need the OS to protect me from poorly engineered apps, I just need it to correctly blame the apps so I know which ones to stop using.

No, but the other 6 billion people on the planet do.


Which is why Apple is so big. Also Walmart. Also Top40.


Classic HN response.

I'd guess a FTP and a linux file-server would solve all your filesharing woes as well.

No dev making a mass market device or software should build as if the 1% graybeard engineer is gonna be the only user, that's a lot more user hostile.


The "which apps are using battery" feature is easily useable by novice users.

However most phone vendors incorrectly assume "background connections" will drain battery life despite evidence to the contrary.

Phone vendors have a vested interest though in forcing developers to use their proprietary "push" feature for syncing to phones, they say it's for "battery life" but really its about vendor lock in.

A well engineered app can sync over its own TCP connection just fine and not hurt battery life, but then such an app can work on any device, not just blessed Android builds that have access to GCM.


Android's "these are the apps killing your battery life" interface is perfectly usable by Joe Everyuser. This is a specious argument.


Reality suggests otherwise.

Every modern phone today will give you a list of the apps that take the most juice, and yet somehow for some reason people still install facebook. We might need to protect users from themselves.


Or users could start holding facebook accountable for shitty battery life.

I don't understand why phone manufacturers need to add features to protect facebook users from facebook. facebook has the money to build an app that isn't shit.


Never mind HN, that's a classic Slashdot response.


A bouncer is not a satisfying answer, then I could just use something web-based anyways.

My Android tablet is on a stable WiFi network at home...


>"Use a bouncer" might be the answer there.

Weechat and weechat-android are great choices here. Best CLI and Android IRC clients I've used, and I've tried quite a few.


I run Cisco Jabber on my iPhone, and it seems to run fine. AFAIK that is XMPP.


Getting messages should not/does not have anything to do with running in the background.


If you want a messaging app to work well, it should send and receive messages when the phone has network connectivity and power. Power is a prerequisite for running in the foreground, but network connectivity is not. Some people may in fact want messaging apps to only work while in the foreground and network available, but I suspect that's less desired.

If you're trying to run standard irc and appear online as much as possible, that's not going to work in iOS without a bouncer to stay online for you and send push messages to send notifications and allow the app to run for a bit to download the messages.

It's probably not a bad idea on Android too, it's technically possible to run as a background service and stay connected, but there's a lot of uncertainty, because other services can crowd you out, and you're at the whim of Google and oems with power management these days.


And also, it's the 21st century and we don't need chat protocols to be client-side-liveness chatty to "stay on" when the entire cellular network is architected to find devices and route messages to them.

IRC isn't a well-designed protocol for this use case, and a "land-side" bouncer that bridges the chatty protocol to a lazier protocol ought to be more energy-efficient overall.


Well-designed or not, it exists, and sometimes you just want to use it, without a lecture on how it's suboptimal.


That's fine. you are "free" to hack your own version of Android that modifies the APIs to disregard power-management best practices.

... and maybe your own hardware to run them on. But I wouldn't expect any major player competing against other companies to do the work for you when the outcome is supporting some chat protocols that most people don't use.

(Otherwise, if you're expecting vendors to do it for you, you get to expect the lecture that comes with that expectation, in the form of APIs designed to minimize the ease of doing the wrong-for-the-average-utility-of-the-platform thing. Your cell radio could probably be adjusted to operate as a spark-gap transmitter also, but I don't expect them to provide an easy API for that either ;) ).


Getting messages requires an open TCP connection, hence it really is quite important (at least with IRC) that the app stays running in the background.


This is what the push message API in iOS is for. It wakes up the app when messages come in.


> This is what the push message API in iOS is for. It wakes up the app when messages come in.

IRC isn't reliant on a proprietary push message API, though (be that provided by Apple or Google).

I'm sure there are long-lived bouncer plugins that will integrate with said APIs, but the core IRC protocol is not suited to or designed for devices that aren't capable of a long-lived connection.


Which means there is a third party eavesdropping on chat.


Receiving messages (aka "listening" in server jargon) is essentially a background task, constantly probing to check for any changes.


I think the point being made is that’s a terrible use of resources, not only are you keeping the app running, but you are also forcing the power hungry LTE radio to stay on more.

This idea that the end device should do all the work is not a sustainable approach. There should be a server side component that is handling this for you and sending push notifications when your app needs to wake up for new data.


> sending push notifications when your app needs

How do you think push notifications work? There isn't some magic in LTE to wake up your phone. Your phone needs to keep a connection open in the background and periodically wake up the modem to check for new information.

I use Conversations (XMPP client) on Android, it keeps a plain old TCP connection open in the background and honestly it does not much battery at all. It's consistently at the bottom of battery usage according to my phone.


Do push notifications take advantage of knowledge of the physical layer of the network?

It's a lot cheaper to keep an LTE radio on in a low-wattage "ping me if you need me" mode and trust the 'infinite-power' landside terminal to notify you of messages than to wake it up once every N seconds to loudly ping a cell tower "HEY LET ME KNOW IF I HAVE ANY MESSAGES KTHX."


> How do you think push notifications work?

There’s a very distinct difference between having a persistent connection that only transmits data when there’s something notable vs having a connection that constants pushes a kitchen sink of data that may or may not be needed. Sure, if you sent a push notification on every single message and status change on the IRC server, it’d likely use the same amount of (or maybe more) battery, but who does that?


Right. That's why there's an API for it. Each app doesn't have to stay awake listening. The OS will wake the app up.


Oh, that does make sense.

In that case, having the app run the background really does seem like a waste when compared to leaving the OS to do this task.


Slack receives messages with no problem.

If XMPP/IRC can’t provide that, it’s not iOS’ problem.


Slack works because of push notifications. A random IRC app can't handle push notifications for you because they aren't the IRC server and aren't running a bouncer for you. On the other hand, the IRC server can't handle push notifications for you because they don't have an app signed with Apple's key sending the notifications.

Basically protocols as a general thing can't work on iOS, only individual apps/services which get to read all your messages and access your login credentials work.


> Basically protocols as a general thing can't work on iOS, only individual apps/services which get to read all your messages and access your login credentials work.

Which I think is a reasonable requirement for a chat service, especially on mobile.


I don't know why you were downvoted; it's a solid-and-concise critique of the difference in protocols.


> And apps that don’t fit those use cases - what are they doing with your device?

What I, the owner of my device, have directed them to do.

Apple's approach makes easy things difficult (because one must use their APIs) and difficult things impossible (because Apple have decided that purchasers of their devices shouldn't be permitted to do things Apple wishes them not to do).

I want a general-purpose computer that I own & control in my pocket, not some stripped-down communicator owned & control by someone else.


You've definitely made the case that you don't want an iOS device.

... the market appears to be making the case that you are not the average consumer, but that's an independent variable.


The market has consistently been choosing Android phones in higher volumes than iPhones for years.


> Why do I still have to grant an application all the permissions it requests when I install it instead of being able to turn them on or off individually?

I don't think this is true in the later releases is it? I get a lot more ad-hoc permission requests these days, and there's much more control in the application settings (the android app settings, not the settings the app presents).


It is true to some extent since Marshmellow. But apps can tell when their permissions are denied, so some of them straight out refuse to start unless you give it all the permissions it wants. This is especially problematic when a new version of an app holds your data hostage and refuses to start unless you give it a ridiculous new permission.

The Play Store has no requirement that apps degrade gracefully when permissions are denied. So the result is usually the same as pre-Marshmellow. You just get more annoying popups.

I miss Cyanogenmod where I could deny a permission (e.g. contacts) and the app would have no idea it was denied (it would receive an empty list of contacts).


I really wish I could whitelist which contacts each app could see, so WhatsApp only sees the ones I want on that app.


> But apps can tell when their permissions are denied, so some of them straight out refuse to start unless you give it all the permissions it wants.

I'm pretty much fine with this, though the data-hostage situation you describe does seem bad.

You're right that from a user control perspective, the cyanogenmod approach is likely best.


That is the case in iOS. All permissions are optional and the app must gracefully degrade if permissions are denied.


Unfortunately, some apps just degrade, ungracefully, by flat out refusing to run without certain permissions.


On iOS? That's against app store rules if I remember correctly.


Should also see if the killer apps are phoning home every time they kill anything, along with info about which app is killed on whose phone at what time. Becuase, you know, analytics.


On my phone (android), going to apps>selecting app I want to run in the background>battery>background usage I can allow the app to run unrestricted in the background.

All android phones I've owned had this option.


My understanding from the OP website is that this is ineffective for certain popular phone vendors' customizations. In particular, the Nokia phone listed comes preinstalled with an app that aggressively shuts down any running process, whitelisted or not, if the screen has been off for 20 minutes. There's simply no way to stop this behavior apart from gaining root and uninstalling the battery "saving" app, or flashing a stock Android image that doesn't contain it.


A design so disrespectful it borders on malware.


The Nokia one is egregious, but their second worst vendor (OnePlus) allows users to whitelist individual apps, though there's a bug right now where that setting gets reset randomly.


And yeah, the permissions model in Android vs Apple is different, but multi tasking in particular feels the same. i.e. Apple has fine grained permissions on demand for contacts, microphone, camera, location, etc, and requires that all apps gracefully degrade when permissions is denied.

But for multitasking there isn’t really any fine grained permissions - as long as the app is doing a whitelisted task in the background, no user permission is required. I think Apple does check that background APIs are not misused as part of the review process, though - I don’t think you could implement a tracking socket masquerading as a background download, for instace.


As I understand it, on iOS third part apps don’t actually do any tasks in the background, most such services are actually implemented by platform services provided by Apple that the third part apps request or subscribe to. So for example apps request an Apple service to do a background download on their behalf. Or the app subscribes to a notification feed that wakes it up when triggered to handle the notification, but the app doesn't do a download or wait for notifications itself.

Very often on iOS when you see a notification 'from an app' or something in the background is completed 'by an app', in fact the app didn't do any of it. This means fine grained permissions for background processing aren't really an issue on iOS, because such behavior is managed and guaranteed by Apple. It only matters when there's a security or privacy implication.

This is why background activities came so much later to iOS, because Apple had to very carefully think through and implement all the background services apps would require in an efficient and secure way.

EDIT: To be clear there are some exceptions but I'm not sure exactly what they are.


For some basic use cases, like notifications and downloads, there is a special system or api that allows your app to do that in the background without actually running.

If you want to play audio or track gps in the background you need to do things yourself though.


OK, hence the Facebook issue where they played a silent audio track to keep their app active. I'd forgotten about that, thanks.


Wow, that sucks is again super user hostile, I'm so happy I removed their app.


Technically, you could have an app that plays silent audio in the background to keep from getting killed and then do something else, but that would get flagged by the review process.

But, if I recall correctly, VLC will continue a background file transfer session from its built in web server on iOS if you play a movie in the background. Otherwise it will be killed after 10 minutes.


I think they've wisened up to that trick. My girlfriend and I use a guided meditation app that has long silences in the audio. If the screen is off, her phone kills the app after about thirty seconds of silence, making the app practically useless.

I was going to report a bug to the app suggesting they include some ultrasonic or subsonic audio to defeat this mechanism, but it's just an arms race at that point. The phone will start looking at the total power in the audible spectrum to decide whether to kill the app or something.

This kind of thing is infuriating and prevents apps from doing anything outside of the box, stifling innovation and making users frustrated.


>I don’t think you could implement a tracking socket masquerading as a background download

The Facebook app used to play a silent audio track to stay active in the background, until they got called out: https://www.reddit.com/r/iphone/comments/3opxhm/facebook_app...


Holy crap, I didn’t know that. Yet another reason I was right to uninstall the app and just use the website.


This isn't about protecting the user from badly written and battery draining apps. Almost all of the mentioned manufacturers ship their devices with a long list of pre-installed and whitelisted services, including Facebook and other spyware.

As a developer myself, it is just annoying do deal with and just not scalable if you have to explain each user individually how to turn of these "optimizations" (if that's even possible).


It’s also not scalable if every app starts running background processes on an operating system without “virtual memory” - yes, I know there is a difference between virtual memory and swapping to the disk.


Even stock android does not guarantee that background services can run indefinitely, but Google at least provides clear rules what process may run how long in the background and under which circumstances it is killed. I have no idea why the manufacturers are allowed to blatantly break those rules and still brand their operating system Android.


I think that's an over fatalistic interpretation. You're implying that giving more power to users inevitably results in them harming themselves and therefore should not be done, instead the OS vendor should make explicit APIs for everything and only whitelist "allowable" things.

My problem with that is that it kills all innovation and creativity - only the OS vendor can come up with a "new" whitelisted activity. Anybody else is out of luck. Inevitably that means you simply can't get niche applications because what Google or Apple sized company is going to invest in something only 10,000 people might use? I might be idealistic, but I firmly believe that it's possible to both grant power to end users (as in, enable app developers to have a very large amount of control) AND deliver a good end user experience. It requires a lot of good design and discipline and it's definitely hard, but that's not an excuse to give up and hand over all control to the OS vendor.


I think the locked environments we have on phones is the reason we see a lot of trash apps. You don't have this development on more open platforms. At least no to that degree. So both, Apple and Google are at fault here.

It is not the API, it is not threading capabilities. Just shitty and locked environments. So define as many additional rules as you like. Won't change much.


The locked environment may prevent users from removing branded crapware installed by vendors, but it's not its cause. Popularity is. If Gentoo Linux (just to name one we wouldn't expect Joe User to know) became popular as Android on cellphones, we would see in no time vendors trying to cram their crapware into every platform running Gentoo as well, but its open nature would allow users to remove unwanted stuff, so vendors would use any tactic to make it less open in order to force users to run their crap, get more brand exposition, steal personal data etc.


> but its open nature would allow users to remove unwanted stuff

They would find a way, because money.


Right, so 'open' Gentoo would get forked into a hundred locked down, obfuscated, proprietary flavours with all the same problems. In fact it's only a closed system with a single gatekeeper that can avoid this problem at scale, because it's the only way to maintain clear lines of responsibility.


> Right, so 'open' Gentoo would get forked into a hundred locked down, obfuscated, proprietary flavours with all the same problems.

That's the beauty of the GPL: one can't lock down a GPLed distro that way.

> In fact it's only a closed system with a single gatekeeper that can avoid this problem at scale, because it's the only way to maintain clear lines of responsibility.

Those who s/freedom/security/g tend to rm -rf / and get neither freedom nor security.


"That's the beauty of the GPL: one can't lock down a GPLed distro that way."

True, but its strength is also its weakness in this context: anyone can keep the distro open but add some "vital" code that is closed and does what they want without anyone noticing. The GPL doesn't prevent closed code from running on open source machines, it just sets limitations on imposing limitations (which makes it so great IMO), so a module that displays advertising, tracks users or steals personal data can easily be implemented inside a closed app, blob, device driver etc. and unless I missed something the GPL can do nothing if that module was compiled using non GPLed compilers, linked against non GPLed libraries etc. In other words, if I take a non GPLed compiler and a set of non GPLed libraries that set no obligation to open the resulting code if I distribute the output, I can write anything and add it to a Linux distro then distribute them together without any legal obligation to publish the source and reveal the internals of my code. That would be the case for suspicious code inside blobs and drivers. Someone please correct me if I'm wrong.

Of course the community can fork in no time, but imagine a very popular piece of hardware which could work only with that closed blob.


> only a closed system with a single gatekeeper that can avoid this problem at scale

I guess you are hinting at Apple phones but this works only because the gatekeeper is acting in good faith. Then again why do you need a single gatekeeper?


You clipped off my answer to that question from your quote.

I mean you can disagree, that's fine, in which case just say so.


> In fact it's only a closed system with a single gatekeeper that can avoid this problem at scale, because it's the only way to maintain clear lines of responsibility.

PC hardware is available from arbitrarily many vendors and you can install stock Windows or Linux on pretty much all of it. Many of the OEMs preinstall their various spyware, but you don't have to buy from them to begin with, and even then they can't stop you from removing it.

The primary difference in the phone market is the lack of open source drivers, so you can't install stock Android on your arbitrary phone because it needs the specific weird kernel it came with. But basically everybody hates that -- even the OEMs, because they neither want to be blamed for not providing updates nor want to have to actually provide them themselves. So it's slowly changing.

And even now, as a customer, there are unlocked devices available that will run stock Android, all you have to do is buy one of them.


The point is trash apps don't have to be a problem as long as the platform is managed properly. Anyway your trash app is probably someone else's fun entertainment.


I just doubt that "managed" platforms are delivering what they have promised and think that the quality of apps on more open systems is generally better by a few magnitudes without exaggerating too much.

And no, the trash app I am talking about exists to prey on unaware users by being an obvious fake or by extracting information about location, contacts and configuration.

"Managed" platforms accelerated this phenomenon in my opinion.


What is a trash app by your definition?


We are running a (very niche) platform + app for people with special needs, where accurate and offline alarms are necessary: this is a big problem for us.

I think about 1/3 of all our support requests are about the app being killed in the background on specific phones. The part of the app that does the actual scheduling of the alarms is a big mess with lots of device & API level exceptions. Debugging alarm problems is a nightmare.

We often advice users on what phone to buy and tell them to avoid specific brands. Sometimes users even need to buy a new phone to be able to have reliable alarm signals.

I understand why manufactures are doing this. But it really degrades the user experiences for our users quite a bit and is a significant cost (in terms of support load + extra development) for us as an app vendor.

Really hope that Android 8+ incentive manufactures to just use the standard Android mechanisms: they seems to work quite well in my experience. You can run things in the background, but only if it has a user interaction as a result: i.e an alarm notification. The user can then determine if this is wanted or not directly from the notification itself.

Unfortunately it is not much better on the Apple side of things with local push notifications limits.


>I understand why manufactures are doing this

I really don't. User has power to uninstall or replace app that is in his opinion using too much power. There is no need for manufacturers to intervene. They should only display warning about app using too much power. But it seems killing app is so much easier for them.


The majority of people don't know how or even want to be an administrator on their phone. They'll just as quickly hand the phone off to someone else to fix it, or call support, or even just get a different new phone. It's way too much of a leap to assume most users will make the connection that their poor battery life is linked to an app misbehaving, then track down that app and uninstall it in favor of an app that is better on battery.

If Samsung kills the apps, the app maker gets a bad review. If Samsung doesn't kill the apps, Samsung gets a bad review. I know which one I would pick if I was Samsung. At that point it's up to the user to decide if that choice is something they want to subscribe to.


>make the connection that their poor battery life is linked to an app misbehaving

that's why I mentioned, they could display some notification when app is using battery heavily (similar to ANR).

>The majority of people don't know how or even want to be an administrator on their phone.

Exactly same thinking as those device manufacturers. user = idiot (let's kill apps for him, what could go wrong, right?) This kind of thinking brought us here.


Does Android not have the concept of “local notifications” where you can tell the OS to schedule a notification to be sent to the app to wake it up instead of being in the background the whole time?


It does - the one that works properly is https://developer.android.com/reference/android/app/AlarmMan...

However, the implementations of the API are questionable.

Some calls to that API on some OEMs device round alarms to the nearest minute, some to the nearest ten minutes.


> Some calls to that API on some OEMs device round alarms to the nearest minute, some to the nearest ten minutes.

WHY? What benefit does that serve?


>WHY?

Because China.

Having lived in China for a few months with an Android phone I can with absolute certainty tell you that this is needed over there. The amount of garbage apps, even from big companies like baidu is enourmous!

And without a Google playstore, or play services, or play safety thing it is an absolute wild-west of background alarms, API calls, battery draining and whatnot.


Sorry, how does rounding to the nearest minute or nearest TEN minutes solve any problems?

Like are apps setting alarms for every 3 seconds or something for no reason??


Yes. Rounding to 10 min means you fire up the cpu and do all apps at once then go idle.


Oh, so when we say "alarms" we mean "background processes that occur at set intervals"?

Not literally "alarms", like the ones that ring?


Both.


Rounding timers can greatly increase battery life, at the expense of apps not working - but who checks that apps work on their phone before buying it?


Limits the potential battery impact.

Without this restriction, how long before an app maker schedules their alarm every millisecond?


Probably a crude way to stop apps from waking themselves every minute.


'Performance'

Edit: It's become the new '911'... Family Guy Joke!


As others replied; it does. But the API does not behave consistent on different brands and API levels.

Also some manufacturers cancel alarms when the user swipes away an app (which some users do constantly to keep the recent apps list "clean")


I'm one of those users. The visual clutter leads to mental clutter. Having a "clean" notification bar makes it easier to ignore the pavlovian "check your phone!" conditioning that has built up over time.

I appreciate that in some cases apps need to be in the notification bar in order to remain running. I also appreciate those like Tasker that have the option to hide their icons or use "empty" icons (so nothing shows).


It has, but from what I've read some of these "optimizers" helpfully "optimize" the scheduled notifications away or move them around in time.


Yes, and these manufacturer optimizations often break them.


What about changing your app to a service that you host that calls their phone instead of an alarm?


He did specifically just say they have to work offline.


doh, must have missed it


Killing apps is a good thing. There have been battery saver programs since the very beginning of early Android versions to kill of connectivity and clean up running apps. When Android now supports some of that natively and vendors too, even more aggressively, this is just responding to users' needs.

There is a quite clear usage pattern to support this behaviour: unless I explicitly say so, I don't want apps on their own to "do stuff" no more than I want my Ubuntu to "do stuff" while I'm doing something else. I only want the application to respond when I'm viewing it.

On Ubuntu, I always disable stuff like evolution server and automatic indexing after a fresh installation. At least you can do that on Ubuntu, that isn't necessarily always possible on locked-down systems. I'm happy that Android is quite usable these days because of Doze and background task killing.


Did you even bother reading the complaints? These "background killers" kill background applications the user wants to run and has specifically asked for e.g. alarms, health/fitness trackers, …, usually in the most harmful way possible (e.g. straight kill -9) meaning the application can't even tell the user what the issue is, and with complex steps users have to take (possibly repeatedly) to whitelist specific applications.

Hell there are comments in this thread testifying that these built-in "battery savers" even kill the built-in alarm application.


been using android since forever. Now I'm on a s8+. I never had a case like this. maybe I didn't noticed it. But my alarm always went on like it should. my music always played.

is this a bug that sometimes happens? how rare is it?


S8 has this, but can be opted out (plus it has what I assume is a whitelist of pre-approved apps, but even those can be opted in, IIRC). It's clumsy, but sort-of works. It does break some old apps that rely on scheduled wakeups, though :(


Also the Samsung variant will not kill the app or service that is showing a notification as it should. So the three problem is limited to apps relying on dumb running in background.

Alarm scheduled wakeups get rounded to a minute in power saving mode though.


Seems it's mainly an issue with Nokia devices, the other manufacturers were minor problems in comparisons.


It is not a good thing to kill an alarm app then purposely ignore its registered alarms, or killing a media player the user wants to listen to in the background.

You using Ubuntu so you’re fine with wasting time setting up stuff that’s just supposed to work, but most users are not

Case in point:

https://androidcentral.com/blocking-huawei-phones-downloadin...


I mean sure, but at least give me a way to override it. On my OnePlus 5T running Android Pie, the system will keep killing my VPN client when in sleep mode, even though I have selected that I don't want to optimize it under battery usage. With the VPN client restricting all unprotected access, it means that once the phone goes into sleep, I stop getting all notifications for anything because there is no internet connection. It's very frustrating.


I use NetGuard on 5T, which is using VPN API, and that seems to stay alive. That with battery optimization off for it and with its own watchdog option enabled. I think I had it dying without watchdog though.


Try selecting 'Lock' for the VPN App from the recent apps section (top right)[1]

[1]:https://imgur.com/Bk8jXbJ


Hmmm, I had no idea this was a thing. Will give it a try!


On my phone, if I go to the apps list>tap app I want to run in the background (VPN app for example)>battery>allow background usage.

I have a galaxy S9 but there should be the same or similar setting on yours.


It's exactly the same thing he's talking about. The issue here (I also own a OnePlus 5T) is that OnePlus' implementation of memory saving is too agressive and often ignores user configs.


Actually, I think it depends on the use-case. I mean, there are some use-cases which are inherently battery intensive. Like accurate position tracking or receiving real-time messages.

I think the problem is, that many users do not know which apps require more energy due to the specific problem they solve and which apps are just badly engineered. So to let the user decide every case is a bad option (+ decision fatigue). Letting the developers decide is even worse, as they would simply say, that their app requires as much energy as they need. So the vendor thinks he has to make that decision (as they don't want their phone to being perceived as having a bad battery life), who neither knows anything about the specific app nor about the use-case (probably the worst option).

I think the system should simply report battery offenders (above the threshold of a well-engineered instant messaging app for example) to the user in a manner of 'App X used Y% of your battery in the last 24 hours. By limiting the battery usage, the app might not function as it is supposed to be. Do you want to limit the battery usage of this app?'

That way, most developers would have a chance to build good apps which do not get reported and users would stay in control.


> in a manner of 'App X used Y% of your battery in the last 24 hours.

I am pretty sure that my stock Android 8 is doing that already


Killing background tasks is great and Android does that automatically to save battery usage. But these manufacturers have implemented their own functionality on top of Android which cripples even critical messaging applications like WhatsApp, Slack, Gmail by not delivering Instant Messages notifications instantly.


Just as an example, only chat/messenger apps on my Oneplus with saver enabled (default):

- Skype - always killed

- Slack - always killed

- Whatsapp - sometimes killed, rarely

- Telegram - never killed

- FB Messenger - never killed

All these are fully featured apps with tons of different functionality.

Telegram and FBM never ever trigger "this app is draining your battery" while Skype triggers it regularly when I sometimes start it on phone.

I'm going to generalize and say that probably some apps are simple bad and need to be fixed instead of granting them exceptions and allowing to be battery hogs.


Those apps are explicitly whitelisted by OnePlus. There's nothing to "fix" they're by the app developer, because the killing algorithm chooses based on app name, not app battery consumption. Facebook can kill your whole battery and you'll never get a warning.


So you are saying that behind visible list of apps that are either "optimized" or excluded there is another hidden list where app that is "optimized" could be actually excluded? Ok, that can be a working hypothesis. Why is Skype not excluded the same way then? Or Slack? Millions use them and MS surely has money to promote their app this way. Why Whatsapp is not excluded? It's owned by FB.


There used to be a hidden list. I was the head of android dev for flock , a team messenger and we had gotten in touch with OnePlus who added us to the whitelist. More details here : https://hackernoon.com/notifications-in-android-are-horribly...

Though they were moving away from that model to a model where apps alive for more than a certain time interval in background were killed. So apps which you use the most heavily are more likely to be penalized.


Interesting information. I'm not doubting you here but want to clarify one thing, to understand. After you contacted Oneplus and were added to whitelist, do you still see that your app is showing as "optimized" in the settings but app behavior changed and it is no longer killed in background? And that same is applicable to other major software?


I don't know why it's not there, I'm not an exec in those companies. I know for sure that OnePlus, Huawei and Xiaomi have such whitelists. Other OEMs might have them as well.

This isn't climate change debate, it's easy to check.


I've had a Nokia 6.1 on Pie, apparently the worst-case scenario for this, for a few months. The third-party optimiser is running, and I haven't problems with Slack or Jabber clients. How are people reproducing this behaviour?


I have a OnePlus 6 and none of the apps you've just mentioned fail to receive notifications when my phone is asleep.


It does happen on oneplus devices and it's quite common to find complaints on oneplus forums like : https://bit.ly/2VSkhty . In all cases it is solved by adding these apps to the whitelist.

If you aren't facing issues then these apps are probably already a part of the whitelist on your device.


Auto-killing apps to save battery is obviously good - nobody is contesting that. The bad thing that is being highlighted here is that there's no user friendly way for app developers to request additional privileges from the user.


If you're looking for user friendly ways to request privileges, that solution should really be offered by core android in a way that works for manufacturers and users and probably won't appease all developers. App permissions systems have been a nightmare for users from the start so you can't expect users to learn a newly revamped permissions system. They'll just continue to ignore permissions on install and complained when their phones aren't working the way they expected. What's evolving out of the manufacturers is a simplified system that requires explicit permissions from the user after installation to enable problematic privileges and active governance to manage battery/data hogs.


What?

The system you’re saying “evolved out of the manufacturers”, runtime permission requests, is from “core Android” all they way back at 6.0

And the problem has almost never been users blindly revoking permissions, it’s blindly granting permissions.

The problem the parent comment mention isn’t the method of asking for permission, it’s the fact there literally is not a permission.

And Android already has built in “active” battery management with Doze, if anything manufacturers are ruining it with poorly coded “optimizers” that do dumb things like kill their own alarm apps...

And even if Android did add a permission to allow an app to do whatever it wants in the background and kill the battery as much as it wants, manufacturers can’t be bothered to write optimizers that don’t kill a music playing app while the user listens to music, why would they bother respecting a permission they didn’t make?


> And the problem has almost never been users blindly revoking permissions, it’s blindly granting permissions.

If I wasn't clear, this is what I meant. Users ignore and accept permissions blindly on install.

> if Android did add a permission to allow an app to do whatever it wants

I'm not suggesting this at all. I'm suggesting that permissions systems, as granulated as they are, only make sense to developers and are mostly ignored by users.

> The problem the parent comment mention isn’t the method of asking for permission, it’s the fact there literally is not a permission.

I agree with the parent comment on this. Some permissions queries should be available on first use, rather than (or in addition to) on install.


we would end in the same place where we are now, apps would nag and require that we put them on the whitelist, I have a huawei mate 20 pro, the biggest reason thah I like this phone is the battery life. it has a huge battery and with agresive management I can go with 50% from morning till evening. there are only couple of apps in my whitelist. everything else its free to manage for me automatically. before that on my nexus device I got annoying notifications from my smart watch watchface app, that was using notifications for promotions and such.


Killing apps that the user isn't using or relying on is a good thing. Randomly killing apps running in the background is a bad thing.

This sounds like it should be an app permission: is this app allowed to run in the background or not?


LG even lets you pin apps you don't want auto-killed which is useful but I rarely use it since I kill them manually before it gets to do it for me, I didn't realize this was an issue on other phones. I guess that's why LG is technically not on this list? I've always thought it was a stock Android feature.


For me this problem is very real. For example I got my mother a Pocofone F1 (by Xiaomi). Everything works fine, WhatsApp notifications arrive but there are some apps which just get crushed by Xiaomi's battery saver.

Audible's lock-screen widget for example just does not show up unless you enable/disable 2-3 battery saving and notification settings after installing the app. I think this incantation can't be expected even from advanced users. Normal users will just give up and live with terrible UX, complain to the dev or switch to another app. The same goes for fitbit, getting it to sync in the background involves a similar mixture of battery saving and notification settings which are labeled in a way that noone would dare to change them or have questionable defaults. None of this was an issue on the Nexus 5X. To me it looks like Xiaomi has a whitelist of apps which get special defaults when installing so they work fine while others which are not on this whitelist don't get this treatment.

I can understand the benefits of aggressive battery saving especially as there are apps which behave badly but the state it has come to now is terrible UX and is just another frustration instead if actually delivering a benefit to the user. This seems to me like "optimisation" for the sake of benchmarks and marketing claims.


If they didn't do this sort of aggressive system management, I'm wondering what the negative effects would be for them as a brand. I doubt it would be about benchmarks, those are generally done on clean systems at least for review purposes. Likewise Marketing is mainly about features.

I suppose it must be genuinely about the user experience and brand perception by device owners. If the phone slows down and the battery drains fast users will blame the phone manufacturer, while if apps crash or app features don't work users will blame the app vendor even though the reality in both cases would be the other way around.


Another anecdote: my wife and a colleague at work (so 2 different people I know) have Xiaomi Note fives, and this model kills the stock alarm clock app! Regularly for both these people the alarm does not go off. My wife keeps an old Nokia candy bar phone around as a backup alarm it has happened so often. There's a workaround, maybe just placebo?, for this too: you can go to the recent apps screen and pin the app. But any kind of system update seems to undo the fix. I imagine your audible lock-screen widget will have the same issue, that system updates break the fix, and MIUI updates quite regularly.

I have a Xiaomi A1, with a more stock version of Android, and so far this has not been an issue. But I noticed in the recent Pie update that it mentioned "battery improvements". I've had no problem with battery before now, it lasts all day easily and I get home with 70% or so. I hope it doesn't start killing the alarm clock at night, when it's plugged in to charge, just to save battery.


The first thing I do on any Xiaomi phone is to install Lineage OS - because MIUI is just unusable for me. Lineage 16 release for Poco F1 is very stable although it's not an official release yet.


Go to the developers settings and turn off MIUI optimization. That's the only setting that worked for me. No more killed bg apps.


MIUI has always known for aggressive sleep patterns, considering Pocofone is an India targeted device & WhatsApp is the go-to social media platform in India; It's intriguing that they haven't fixed such issues.


I actually like the move to kill background tasks. Don't get me wrong I think they're great when they're needed. But if I only installed the app because the mobile site is crippled I don't want it to destroy my battery polling for content changes when I only open the app once in a blue moon.


The right way to solve this is with explicit permissions (similar to iOS). Rather than arbitrarily and sporadically crippling apps with opaque limitations.

Google & manufacturerers have gone too far in the quest for the Holy Grail of extending battery life. To the point where it’s negatively affects the user experience quite often (there are quite a few examples in these comments).

It makes Android overall seem more buggy (for example, not receiving notifications for an instant messaging app is pretty ridiculous, assuming I’ve opted in and want these notifications).

One other big issue is that push-based wake-ups on Android don’t work reliably. For example, on iOS, if you want to wake up the app in the background when you come in range of an iBeacon, you can do so (with user permission), and it just works. Meaning you don’t need to run a special arbitrary background job (which is much less battery efficient).

On Android - BLE wakeups are so incredibly unreliable that entire classes of apps are becoming less and less viable. And without the loophole of running background jobs to manually scan for beacons, users (and developers) are basically shit out of luck.


God save us from beacon-related functionality anyway. No I don't want my day interrupted for a message about your service, sorry!


In that case you wouldn’t opt-in to beacon notifications.

But there are many people with varying use-cases - some of whome want reliable BLE detections on their devices. And if they opt-in to these notifications, then it’s a shitty experience when it doesn’t actually work as intended.


> In that case you wouldn’t opt-in to beacon notifications.

Never have, got 'location related alerts' a few times before I figured out how to switch them all off, without ever having opted in.

To be fair I have no idea if these were BLE related, but they were annoying.


It makes Android overall seem more buggy (for example, not receiving notifications for an instant messaging app is pretty ridiculous, assuming I’ve opted in and want these notifications).

Do instant messaging apps really need to be running to listen for notifications? Why isn’t listening for notifications being handled by one central Android process that then dispatches it and launches the app if necessary?


That’s exactly how it works - but this service itself is throttled.

And, in Android 9, “App Buckets” will increase/decrease throttling depending on your usage of the app.

For example, an app that you don’t open regularly, but do want receive timely notifications from (like a banking app, or calendar/scheduling app), might only get 1 window a day where it receives notifications.


There is a difference between a notification that is sent to the user just to tell them something and then the user can take action (meaning no need to wake up the app) and a notification to the app for the app to do something in the background.

The former should always get to the user, the latter on iOS is controlled by both the OS based on an algorithm and by the user who can specifically turn off background processing on a per app basis on iOS.


Killing background tasks is great and Android does that automatically to save battery usage. But these manufacturers have implemented their own functionality on top of Android which cripples even critical messaging applications like WhatsApp, Slack, Gmail by not delivering Instant Messages notifications instantly.


And worse, what they're doing confuses android's own code into thinking the apps are crashy.

So if you run e.g. (new JobInfo.Builder(1234, name)).setRequiresCharging(true).setRequiresDeviceIdle(true)... to do something heavy (like reindexing an on-device database) while the phone is charging, that job will simply not be run on some phones. You have to check whether it's been run at app startup, and if necessary run it while the user is actively using your app.


Xiaomi Redmi Note 3 Pro even kills Google Maps navigation after few minutes (with screen on). I have to use MAPS.ME, it doesn't kill it.


I don't want WhatsApp (owned by Facebook) to run in the background on my phone at all times. I don't trust them, especially after Instagram (also owned by Facebook) started using the camera by itself on my phone, without my permission.

Slack would be fine, I guess.


I think you misunderstood the core issue here - it's not that the USER can decide what runs. It's that the USER cannot override those settings and decide that something can run and function if required. There are special whitelists for apps that are allowed exceptions (e.g. Facebook and other common apps are usually allowed to work) and others are killed against the Android API guarantees (e.g. you install Signal messaging app and you don't receive messages because Huawei didn't whitelist the app).


> I think you misunderstood the core issue here - it's not that the USER can decide what runs. It's that the USER cannot override those settings and decide that something can run and function if required. There are special whitelists for apps that are allowed exceptions (e.g. Facebook and other common apps are usually allowed to work) and others are killed against the Android API guarantees (e.g. you install Signal messaging app and you don't receive messages because Huawei didn't whitelist the app).

I blame it on stock Android. Phone manufacturers probably don't want to spend money on OS changes but Android doesn't do the right thing by default so they have to make changes.

The right thing to do is to deny apps launching at startup, apps running in background, and apps getting network access. Let the user say yes or no. Your use case for signal is different from mine. Maybe I just want to see messages when I open the app?

But yeah I agree, the user should be in control.


Android has done the right thing at least since 6.0 and that has resulted in massive battery life improvements.


The irony: Many manufacturers factory-whitelist apps like WhatsApp, Skype, sometimes Telegram. That means that smaller messengers get killed (=no more new message notifications) and users complain to the developer because "with WhatsApp everything works fine"...


These days the app doesn’t run in the background when receiving an FCM push notification (unless it’s already awake). The message is created by a separate Google Play Services process. It’s only when you click the notification does the target app’s process get woken up.

IMO, the best way to solve this is with an explicit “Let this app run in the background” permission, rather than implementing all these “smart” features which are incredibly non-deterministic. Which leads to developer & user frustration alike.

Take the example of the new “App Bucketing” battery saving feature in Android 9, plus a banking app and WhatsApp....

App Bucketing will basically restrict your background processing based on how often you interact with the app. So for your banking app (where you usually want immediate spending notifications), because you don’t really open the app that often, it’s going to start throttling your notifications (and prevent it from running arbitrary background jobs).

But for WhatsApp on the other hand - because you’ll likely open it more often - it will have full permissions to run in the background any time.

If as a user you wanted to prevent arbitrary WhatsApp background jobs and get instant banking notifications - well tough luck!


Then you need to uninstall the app. No phone is going to guarantee you that it won't run.


Yes, I just have to cover the same functionality in other ways before removing my accounts.


I don't want Slack or Gmail to deliver notifications instantly. I'd love to have functionality that saves battery by delaying them.


If the app is killed that doesn't just delay notifications. It prevents them until you manually open the app again.


Yeah, but we're talking about manufacturers adding custom functionality that delays notifications to save battery.


So why not disable the notification functionality if you don't want it?


I want the notification functionality, I just don't need it to be instant.


Delaying them by how much?


For Gmail, an hour delay would be fine. For Slack, probably 5 minutes would be ok.


Both these apps allow you to do that in-app. I have Gmail not notify me for work emails and notify me for stuff on my personal account.


I want all the notifications. This was a question about timing. I don't want them to do the constant polling required for the notifications to appear instantly.


That doesn't save the battery though.


Get one of the phones listed in the link. Xiaomi is brilliant in this regard !


Does it allow the user to configure the delays per app?


Don't most apps use GCM to deliver notifications anyway?


Yes this is very true. Some apps like Truecaller just destroy the battery like there is no tommorow. Most other app including some games keep running just to tell me when it's time to collect my mystery box.

Point being the majority of the apps are badly coded to poll or drain battery, send unnecessary notifications.

This reminds me of the popup blocker thing in web browsers. While there were some legitimate uses most of the time it's abused so every browser blocked it.


To be honest, as a user I really like the implementation of battery saving features of my Sony phone:

1. They are not enabled by default

2. Their settings screen explicitly states what the modes do

3. They can extend battery life significantly

The most aggressive mode is called Ultra Stamina, and it works by basically turning the phone into dumbphone mode -- complete without any internet connectivity, calls, SMS and alarm clock only -- and the phone has no problem lasting a week.

I use these modes extensively when going backpacking for several days, as I do not have to carry any power banks, which saves precious gramms :)

edit: punctuation, grammar


Interesting. Batteries in smartphones usually have five times more battery capacity then feature phones, it should last over a month!


It depends on how often he uses his phone and where he backpacks. Being in a low-signal environment will eat up a lot of battery even on a feature phone plus having screens 5x bigger than feature phones also lead to more battery usage when being used. My old OnePlus3 which at this point is only used for alarms and has apps set to auto update (doze is on, but battery saver is off) in the background lasts around a month before I have to charge it again.


Smartphones also have 5x more screen to light up, too.


Reminds me of YotaPhone 2 eInk display - pretty crummy, but the Snapdragon 820 device stayed on a week on without additional power saving...


My old Turbo 2 could, in fact, sleep for a month in airplane mode (with crappy apps removed). However that would quickly drop to about a week with light usage, e.g. connecting to WiFi somewhere to get directions or pull email for the day.


In my experience, Sony Android devices are pretty well architected. I had a tablet for a long time with a built-in IR transceiver for acting as a TV remote. Seems like a silly add-on, but I used that thing until it broke.


I wanted to say exactly the same. The Sony page is horribly misinformed.

Calling Sony "toxic" for including a useful OPT-IN feature to extend battery life? Pfff...


A much better (in my mind) solution to your backpacking battery life issue is to carry a phone with a removable battery. If you're turning off all services including calls and SMS, there's simply no reason for the device to be powered on at all, and removing the battery guarantees there's not even a trickle of power being drained. For your alarm, well I assume you wear a watch backpacking, so you can use its alarm feature.

Of course, then you have the issue of finding a quality midrange or higher end phone with a removable battery in the first place. They are an endangered species due to the thinness war.


> Of course, then you have the issue of finding a quality midrange or higher end phone with a removable battery in the first place. They are an endangered species due to the thinness war.

I prefer external charging bricks -- if you upgrade your phone, you might need to buy a new cable with an external brick, but you are more likely to need a replaceable battery with a new form factor or output.


> If you're turning off all services including calls and SMS,

The way I read GP he disabled everything except calls, SMS and alarms.

Which kinda makes sense, you want something for authorities to track you in case you end up missing and unable to call for help yourself.


Yep I completely misread that, sorry.


Interestingly though it is possible to remotely detect which users are facing this problem and send them instructions on how to add an app to the device's whitelist. I faced this exact problem in my previous company Flock, and built services to detect and inform users which substantially brought down user complaints.

https://hackernoon.com/notifications-in-android-are-horribly...


Nice write-up, and interesting idea.

But how did you guys deal with the situation where FCM delivers and displays a notification without waking your app up. In that case, if the user dismisses the notification without opening it, then it will count as delivered by FCM, but not as delivered by your app, right? Which isn’t actually the case.


What we observed was that in cases of devices like xiaomi and oneplus, the app goes into a state of being force killed. So even if the notification sent is one without a data payload ( in which case the app is not woken up ) , the notification will not be displayed to the user. To get around this issue we sent all messages with a data payload to ensure that the app is woken up(or atleast the system tries to wake it up).


I have an Android One Nokia (8 Sirocco), and:

a) I wholeheartedly want this behaviour. The phone lasts 2-3 days without recharging, and I no longer fear leaving home with 30% battery.

b) It's not an app that kills background apps. It's Android's own Background Activity Manager, where apps that are not whitelisted can't wake up the CPU. They run only when the CPU wakes up for some other reason (screen-on qualifies but it's not the only opportunity).

I had to get used to it. In one instance the alarm didn't wake me up, because it is not whitelisted to wake up the CPU. After enabling the correct apps, I maintain pretty much the same great battery life and all app functionality I want.


From a usability perspective, this sounds crazy. Is is responsible of me to recommend Android to my non-technical friends?


I wouldn't say so. I got my grandma a cheap Android phone and a book to help her learn because I thought it'd be better since I also have Android and can help her.

My grandma is 89 now, she uses Whatsapp, Youtube and whatnot and I am not kidding but within 2 months she had:

- AVG antivirus (an ad told her she had a virus)

- She had batterylife for 7 hours before a charge was needed due to shitty apps

- Ads on her lock screen?!

- Ads on her homepage

After 6 months and 3 house calls to fix her phone we gave up and she got my aunts old iPhone 5s with a new battery.

It runs iOS 12 now and it runs flawlessly and protects her from all the stuff I mentioned.

From a guy that has always had Android: most users need iOS level protection. Just simple facts.


A cheap phone has worse functionality than an expensive* one? Forgive the snark but this comparison doesn't make sense to me.

*Speaking in terms of launch MSRP.


The software was stock android (Android One project).

The important part was that the 4 year old iPhone 5s had the latest iOS and still works better than a new €250 Android.


No. For anyone non-technical I always recommend an iPhone. I can simply say, "Press this button if you need to open another app." The difference in UI/UX you see on different android phones and auto-hide enabled soft navigation buttons confuse non technical people a lot.


> No. For anyone non-technical I always recommend an iPhone. I can simply say, "Press this button if you need to open another app." The difference in UI/UX you see on different android phones and auto-hide enabled soft navigation buttons confuse non technical people a lot.

I wonder how they'll deal with the new gesture nav (both iOS and Android), because I think that's possibly more confusing to a layman.


It's not a usability problem. It's an option I'm very glad to have.

If you disable the background activity manager, under Settings | Battery, you get the same battery life you do on iOS (about a day, give or take).


If you're not a power user and you're only getting one day from a charge on an iPhone, you may want to investigate the health of your battery.


Another big benefit of going with Apple for non-technical users is the Apple retail stores. These stores host free classes on how to use Apple devices and apps. This is huge for older people.


Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact

Search: