Foreground Service verkar inte exekvera?

Diskussion i 'Frågor, support och diskussion' startad av Adddeeee, 22 dec 2020.

  1. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej,

    Jag har gjort en app som är uppkopplad mot en server som pushar data till appen. För att kunna ta emot alla meddelande snurrar det en Foreground service som lyssnar på inkommande meddelanden. Dessvärre verkar inte servicen snurra hela tiden, undan pausas antagligen av systemet efter en stund.

    Jag gjorde ett exempel där jag skickar en notis var 10e sekund, för att höra på vibrationerna om telefonen satt appen i viloläge. Ibland fungerar det under lång tid, medan det ibland räcker med ett par minuter för att servicen börjar slacka med notiserna.

    När telefonen i kopplad med laddsladd, eller upplåst, funkar det toppen med appen i bakgrunden. Men när telefonen inte är kopplad till laddsladd är det oförutsägbart hur länge servicen får snurra obehindrat.

    Så här skapar jag min foreground service:

    public void onCreate() {
    super.onCreate();
    Log.i(TAG, "Creating Service");
    }

    @Override
    public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "Destroying Service");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    NotificationChannel serviceChannel = new NotificationChannel(
    CHANNEL_ID,
    "Example Service Channel",
    NotificationManager.IMPORTANCE_NONE
    );

    serviceChannel.setShowBadge(false);

    NotificationManager manager = getSystemService(NotificationManager.class);
    manager.createNotificationChannel(serviceChannel);

    Intent notificationIntent = new Intent(this, org.qtproject.qt5.android.bindings.QtActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("Test")
    .setSmallIcon(R.drawable.icon)
    .setContentIntent(pendingIntent)
    .build();
    startForeground(1, notification);

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
    "MyApp::MyWakelockTag");

    wakeLock.acquire();

    Timer timer = new Timer();

    TimerTask t = new TimerTask() {
    @Override
    public void run() {
    //Send notification with vibration
    sendNotification();
    }
    };
    timer.scheduleAtFixedRate(t,0,10000);

    return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
    return null;
    }

    Ideer på vad som kan vara orsaken till att telefonen prioriterar ner min service?
     
  2. N6290

    N6290 Android Apprentice Medlem

    Blev medlem:
    12 sept 2012
    Inlägg:
    4 001
    Mottagna gillanden:
    2 045

    MINA ENHETER

    Vilken telefon har du testat på? Låter som att en batterisparfunktion i just den telefonen orsakar problemet. Testa att stäng av "optimera" eller vad batterisparfunktionen nu kallas.
     
  3. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

  4. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack för svar!

    Jag har skrivit om den lite och nu ser den ut så här:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

    startForeground(1, createNotification());

    start_timer_send_notification_test();

    return START_STICKY;
    }

    private Notification createNotification()
    {
    NotificationManager manager = getSystemService(NotificationManager.class);
    Intent notificationIntent = new Intent(this, org.qtproject.qt5.android.bindings.QtActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

    NotificationChannel serviceChannel = new NotificationChannel(CHANNEL_ID, "Example Service Channel", NotificationManager.IMPORTANCE_HIGH);

    manager.createNotificationChannel(serviceChannel);

    Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("Test")
    .setSmallIcon(R.drawable.icon)
    .setContentIntent(pendingIntent)
    .setTicker("text...")
    .setAutoCancel(false)
    .setContentIntent(pendingIntent)
    .build();

    return notification;
    }


    Funktionen som kallas på varje gång timern går ut:

    public void notifyTest(String s)
    {
    NotificationManager manager = getSystemService(NotificationManager.class);
    String NOTIFICATION_CHANNEL_ID = "test_channel";

    NotificationChannel serviceChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Example Service Channel", NotificationManager.IMPORTANCE_HIGH);
    serviceChannel.setDescription(s);
    serviceChannel.enableLights(true);
    serviceChannel.setVibrationPattern(new long[]{0, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125});
    //serviceChannel.enableVibration(true);
    manager.createNotificationChannel(serviceChannel);

    Intent notificationIntent = new Intent(this, org.qtproject.qt5.android.bindings.QtActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);

    notificationBuilder.setAutoCancel(true)
    .setSmallIcon(R.drawable.icon)
    .setTicker("Test")
    .setContentTitle("Test")
    .setContentText("" + hour + ":" + minute + ":" + second)
    .setContentInfo("" + hour + ":" + minute + ":" + second)
    .setContentIntent(pendingIntent);
    // notificationManager.notify(2, notificationBuilder.build());

    Notification notification = notificationBuilder.build();

    manager.notify(2, notification);
    }


    Om jag startar en timer på telefonen så kan jag se att servicen funkar precis som den ska, eftersom värdet i notisen är korrekt. MEN det kommer inga notiser under tiden telefonen är låst. Eller, det kommer några enstaka, men väldigt få.

    När jag tänder displayen igen kommer notiserna tillbaka och jag ser då att värdet på räknare är korrekt från servicen.

    Varför kommer inte notiserna när skärmen är av?
     
  5. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Jag hade kollat om servicen går mha något annat än skicka notifikationer. Tex logcat, eller skriv till fil om det är väldigt långvarigt. Men ta en titt på batteri optimering som en annan skrev.

    I slutändan är väl en fråga om du verkligen måste köra i foreground, går det inte lösa med workmanager? Alternativt firebase cloud messaging med högsta prio då appen tillåts köra i full kareta i ett par sekunder efter man fått ett meddelande.
     
  6. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Yes, får försöka göra det också.

    Men eftersom min räknare är korrekt, så verkar det som om att servicen exekverar korrekt. Men när skärmen är släckt slutar notiserna att hålla tiden.

    Värdet i notisen är dock korrekt, vilket är värdet som räknas av servicen.

    Det måste vara något som sker i låst läge/skärmen är av. Försökt googla som bara den, men svårt att hitta vad som är orsaken till att notiserna inte kommer som de ska när skärmen är låst.
     
  7. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Kan du inte uppdatera din ongoing notifikation? Varför (om du gör det) gör du flera?
    Edit: Eller är den också fel? Dvs pågående notifikationen.
     
  8. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Den pågående notifikationen är där den ska.
    Jag skapar en till i en annan kanal, men det är sant, det behöver jag egentligen inte.

    Kan testa det och återkomma.

    EDIT: Samma problem när jag återanvänder notifikationen för foreground service.
     
    Last edited: 22 dec 2020
  9. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Har nu testar, och servicen snurrar som den ska. Även request till server går igenom.

    Allt verkar snurra precis som förväntat, förutom att notiserna inte kommer som förväntat. De kan bli väldigt försenade, eller utebli helt. Ibland kommer två åt gången och ibland bara en. Ibland inte alls.

    Det här känns som ett energisparläge av något slag.

    Samsung som är boven?
     
  10. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Man kan typ aldrig vara garanterad att en notifikation kommer fram. Kan vara doze/energispar.

    Behöver du trigga nya notifikationer? Om det behövs kanske det hjälper med notifikationer från firebase.
     
  11. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Förmodligen är det så att sleep/doze förhindrar notisen när skärmen är släckt, och skickar notis vid nästa fönster.

    Jag ska kolla upp Firebase. Dock är appen skriven i Qt, men själva servicen är gjord i Android, för att kunna skicka notiser till användaren.

    Ska se om det är möjligt att använda firebase trots att det inte är en ren Android app byggd i Android studios
     
  12. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Googlade bara lite snabbt utan att kolla. qt/qtcloudmessaging

    Men till en fråga, har du någon backend någonstans? Eventuellt också någon slags inlogg. Annars är det nog helt overkill med firebase messaging och vägen du får gå är nog att be användare ta bort appen från alla eventuella batteri optimeringar och hålla tummarna.

    Var länge sedan jag sysslade med annat än firebase notifikationer så kan finnas något jag har missat.

    Edit: ska det vara någon industri-app kan du alltid aktivera utvecklingsalternativ och tillåta att skärmen alltid är på om den är inkopplad till ström.
     
  13. Adddeeee

    Adddeeee Infant Droid Medlem

    Blev medlem:
    1 apr 2011
    Inlägg:
    11
    Mottagna gillanden:
    0

    MINA ENHETER

    Det är bara för egenintresse! Så inget som måste funka. Vi är ett gäng som spelar stryktips, varpå jag tagit fram en app som visar våra spel och håller koll på topplista osv.

    Servern är skriven som en queryserver och kommer skicka pushdata till klienterna.

    Det verkar ju som om att servicen faktiskt exekverar, trots att inte notiserna kommer som de ska när skärmen är släckt.

    Jag tror att allt funkar när telefonen är inkopplad till ström, oavsett om skärmen är aktiv eller inaktiv. Det fungerar även utan ström när skärmen är tänd.

    Alltså enbart när skärmen är släckt och telefonen inte är kopplad till ström som notiserna missas.

    Ska dock dubbelkolla så jag inte ljuger nu. Ska testa med telefonen på laddning och skärmen av.

    Vi har inga login än så länge.