Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Tuesday, August 23, 2016

How to startForeground() without showing notification?

How to startForeground() without showing notification?


I want to create a service and make it run in the foreground.

Most example codes have notifications on it. But I don't want to show any notification. Is that possible?

Can you give me some examples? Are there any alternatives?

My app service is doing mediaplayer. How to make system not kill my service except the app kill it itself (like pausing or stopping the music by button).

Answer by redM0nk for How to startForeground() without showing notification?


I developed a simple media player couple of months ago. So what I believe is if you are doing something like:

Intent i = new Intent(this, someServiceclass.class);  

startService(i);

Then then system shouldn't be able to kill your service.

reference: read the paragraph which discuss when system stops the service

Answer by Kristopher Micinski for How to startForeground() without showing notification?


As a security feature of the Android platform, you cannot, under any circumstance, have a foregrounded service without also having a notification. This is because a foregrounded service consumes a heavier amount of resources and is subject to different scheduling constraints (i.e., it doesn't get killed as quickly) than background services, and the user needs to know what's possibly eating their battery. So, don't do this.

However, it is possible to have a "fake" notification, i.e., you can make a transparent notification icon (iirc). This is extremely disingenuous to your users, and you have no reason to do it, other than killing their battery and thus creating malware.

Answer by Alexander Pruss for How to startForeground() without showing notification?


I set the icon parameter to the constructor for Notification to zero, and then passed the resulting notification to startForeground(). No errors in the log and no notification shows up. I don't know, though, whether the service was successfully foregrounded--is there any way to check?

Edited: Checked with dumpsys, and indeed the service is foregrounded on my 2.3 system. Haven't checked with other OS versions yet.

Answer by Denizen for How to startForeground() without showing notification?


You can also declare your application as persistent.

    

This essentially sets your app at a higher memory priority, decreasing the probability of it being killed.

Answer by Snicolas for How to startForeground() without showing notification?


You can use this :

    Notification note = new Notification( 0, null, System.currentTimeMillis() );      note.flags |= Notification.FLAG_NO_CLEAR;      startForeground( 42, note );  

as suggested by @Kristopher Micinski

-----UPDATE

Please note that this is not allowed anymore with Android KitKat+ releases. And keep in mind that this is more or less violating the design principle in Android that makes background operations visible to users as mentioned by @Kristopher Micinski

Answer by Lior Iluz for How to startForeground() without showing notification?


Since the 4.3 update, it's basically impossible to start a service with startForeground() without showing a notification.

You can, however, hide the icon using official APIs... no need for a transparent icon: (Use NotificationCompat to support older versions)

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);  builder.setPriority(Notification.PRIORITY_MIN);  

I've made peace with the fact the notification itself still needs to be there but for who ever who still wants to hide it, I may have found a workaround for that as well:

  1. Start a fake service with startForeground() with the notification and everything.
  2. Start the real service you want to run, also with startForeground() (same notification ID)
  3. Stop the first (fake) service (you can call stopSelf() and in onDestroy call stopForeground(true)).

Voil?! No notification at all and your second service keeps running.

Answer by vlad sol for How to startForeground() without showing notification?


version 4.3(18) and above hiding service notification is not possible , but you could disable the icon , version 4.3(18) and below is possible to hide the notification

Notification noti = new Notification();  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {      noti.priority = Notification.PRIORITY_MIN;  }  startForeground(R.string.app_name, noti);  

Answer by Anggrayudi H for How to startForeground() without showing notification?


Just set your notification's ID to zero:

// field for notification ID  private static final int NOTIF_ID = 0;        ...      startForeground(NOTIF_ID, mBuilder.build());      NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);      mNotificationManager.cancel(NOTIF_ID);      ...  

A benefit you can get is, a Service will be able to runs on high priority without destroyed by Android system, unless on high memory pressure.

EDIT

To make it work with Pre-Honeycomb and Android 4.4 and higher, make sure that you use NotificationCompat.Builder which provided by Support Library v7, instead of Notification.Builder.

Answer by Tshunglee for How to startForeground() without showing notification?


Here is a way to make your app 's oom_adj to 1 (Tested in ANDROID 6.0 SDK?emulator)??Add a temporary service, In your main service call startForgroundService(NOTIFICATION_ID, notificion). And then start the temporary service call startForgroundService(NOTIFICATION_ID, notificion) with same notification id again, after a while in the temporary service call stopForgroundService(true) to dismiss the onging ontification.

Answer by Sam for How to startForeground() without showing notification?


Here's my implementation of the technique in the answer by Lior Iluz.

Code

ForegroundService.java

public class ForegroundService extends Service {        static ForegroundService instance;        @Override      public void onCreate() {          super.onCreate();            instance = this;            if (startService(new Intent(this, ForegroundEnablingService.class)) == null)              throw new RuntimeException("Couldn't find " + ForegroundEnablingService.class.getSimpleName());      }        @Override      public void onDestroy() {          super.onDestroy();            instance = null;      }        @Override      public IBinder onBind(Intent intent) {          return null;      }    }  

ForegroundEnablingService.java

public class ForegroundEnablingService extends Service {        @Override      public int onStartCommand(Intent intent, int flags, int startId) {          if (ForegroundService.instance == null)              throw new RuntimeException(ForegroundService.class.getSimpleName() + " not running");            //Set both services to foreground using the same notification id, resulting in just one notification          startForeground(ForegroundService.instance);          startForeground(this);            //Cancel this service's notification, resulting in zero notifications          stopForeground(true);            //Stop this service so we don't waste RAM          stopSelf();            return START_NOT_STICKY;      }        private static final int NOTIFICATION_ID = 10;        private static void startForeground(Service service) {          Notification notification = new Notification.Builder(service).getNotification();          service.startForeground(NOTIFICATION_ID, notification);      }        @Override      public IBinder onBind(Intent intent) {          return null;      }    }  

AndroidManifest.xml

    

Compatibility

Tested and working on:

  • Official Emulator
    • 4.0.2
    • 4.4.2
    • M preview 2
    • N preview 3 & 4
  • Sony Xperia M
    • 4.1.2
    • 4.3
  • Samsung Galaxy ?
    • 4.4.2
    • 5.X
  • Genymotion
    • 5.0
    • 6.0
  • CyanogenMod
    • 5.1.1

To Google: Instead of just patching this bug, can you please provide a permission to let foreground services run all the time without notifications? For some apps, the user might want the app to run all the time but without an intrusive notification.

Answer by Vladimir for How to startForeground() without showing notification?


There is one workaround. Try creating notification without setting icon, and the notification would not show. Don't know how it works, but it does :)

    Notification notification = new NotificationCompat.Builder(this)              .setContentTitle("Title")              .setTicker("Title")              .setContentText("App running")              //.setSmallIcon(R.drawable.picture)              .build();      startForeground(101,  notification);  

Answer by Lins Louis for How to startForeground() without showing notification?


In my Application i faced similar situation. What i did was

For the API version below 19 i just used the below code

  Notification notification = new Notification( 0, null, System.currentTimeMillis() );      notification.flags |= Notification.FLAG_NO_CLEAR;      startForeground( 75, notification );  

For API 19 to API API 21 i just added hide notification in my app preference page

on click on hide notification , i pointed userenter image description here to app settings where user can uncheck show notification

Intent intent = new Intent(Intent.ACTION_VIEW);   intent.setClass(this, InstalledAppDetails.class);   intent.putExtra(APP_PKG_NAME, mCurrentPkgName);     startActivityForResult(intent, INSTALLED_APP_DETAILS);  

For API 21 to 24 i pointed user to app notification settings directly,

   Intent i = new Intent();         i.setClassName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity");         i.putExtra("app_package", getPackageName());        i.putExtra("app_uid", getApplicationInfo().uid);        startActivity(i);  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.