Różne zachowania na różne uruchomienie aplikacji.

0

Cześć, mam dziwny problem.
Ponieważ gdy uruchamiam swoją aplikację w środowisku, a w niej serwis i on rozpoczyna pracę. To wszystko działa tak jak chcę, jak zaprogramowałem.
Natomiast jak odłączę urządzenie od komputera. I zainstalowaną aplikację uruchomię bez niego. To wyskakuje mi powiadomienie od serwisu, natomiast już on nie działa.

Używam w swojej aplikacji NotificationListenerService, pierwsza metoda startuje, onStartCommand - tworzy kanał i tak dalej.
Natomiast metoda onNotificationPosted - już nie działa. Druga sprawa jest taka że jak uruchomię serwis(bez urządzenia PC, normalnie na telefonie), przejdę do ustawień i w ustawieniach dostępu do powiadomień odznaczę i zaznaczę swoją apkę ponownie - to wtedy nagle serwis zaczyna działać.
O co chodzi ? Czy serwis musi jeszcze zaciągnąć jakoś już istniejącą zgodę ?

Ktoś wie jak to naprawić ?
Proszę o pomoc

Edit:

Czyli tak:
Mam aplikację w której odpalam serwis, serwis rozszerza NotificationListenerService() - ponieważ chcę przechwytywać powiadomienia jakie pojawią się na pasku powiadomień.
I generalnie mój serwis jest zadeklarowany w manifeście

<service
            android:name=".objects.MainService"
            android:label="MainService"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService" />
            </intent-filter>
        </service>

I jak testują swoją aplikację, podłączam urządzenie (mój telefon) I klikam w Android studio Run. I to generalnie działa, aplikacja jest zainstalowana. Po uruchomieniu swojego serwisu, działa on jak należy.

Teraz wyłączam aplikację i wyłączam swój serwis. Odłączam kabelek od telefonu łączący komputer.
Odpalam ponownie swoją aplikację i uruchamiam normalnie serwis (podłączam kabelek żeby widzieć logi spływające)
Wyskakuje mi komunikat że serwis pracuje, ale nie jest wykonywana wgl ta metoda onNotificationPosted() (mam tam Log.D na starcie i jest zawsze przynajmniej powiadomienie jak coś się wydarzy)
Teraz żeby było śmieszniej, jak odpalimy serwis i pójdziemy do uprawnień aplikacji w ustawieniach systemowych i ponownie nadamy jej uprawnienia na dostęp do powiadomień. To serwis startuje.
Stąd moje pytanie było czy musi być jakieś zassanie jeszcze raz pozwoleń:

moja metoda onStartCommand:

 public int onStartCommand(Intent intent, int flags, int startId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(
                "abc.eu", "xyzabc", NotificationManager.IMPORTANCE_HIGH
        );
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(notificationChannel);
    }
    Intent intent1 = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification = new NotificationCompat.Builder(this, "abc.eu") 
            .setContentTitle("title")
            .setContentText("Content")
            .setContentIntent(pendingIntent).build();

    startForeground(1, notification);
    packageManager = getPackageManager();
    apps = loadData(apps);
    Log.d("MainService", "onStartCommand");
    return START_STICKY;  
}
0

Z tego co się zorientowałem to tak musi być. Tzn że ja muszę po wyłączeniu serwisu i uruchomieniu ponownym iść do pozwoleń. I zaznaczać jeszcze raz (nadawać jeszcze raz) te same zaznaczone już pozwolenia. Wtedy serwis będzie korzystał z swoich 100% możliwości.

Ale mam jeszcze jedno pytanie. Bo ja używam MainService extends NotificationListenerService
I buduje, uruchamiam ten serwis za pomocą metody:

Intent serviceIntent = new Intent(this, MainService.class);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            startForegroundService(serviceIntent);
        else
            startService(serviceIntent);

I teraz tak, startForegrindService wymusza w pewnym sensie na pojawienie się takiego powiadomienia:
screenshot-20201217214921.png

I bardzo chciał bym to ominąć, a przy tym zachować pracę swojego serwisu na dłużej niż te 60 czy 90s.
Dało by się jakoś podtrzymać zwyczajny serwis (startService()) tak żeby on mi nie był zabijany przez system ?

0

Daj cały kod albo chociaż szklaną kulę to powróżę.

0

Serwis rozpoczynam tak:

Intent serviceIntent = new Intent(this, MainService.class);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            startForegroundService(serviceIntent);
        else
            startService(serviceIntent);

Natomiast w serwisie, jak się uruchamia to onStartCommand zaczyna tak:

 public int onStartCommand(Intent intent, int flags, int startId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(
                "abc.eu", "xyzabc", NotificationManager.IMPORTANCE_HIGH
        );
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(notificationChannel);
    }
    Intent intent1 = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification = new NotificationCompat.Builder(this, "abc.eu") 
            .setContentTitle("title")
            .setContentText("Content")
            .setContentIntent(pendingIntent).build();

    startForeground(1, notification);
    return START_STICKY;  
}

Jest to serwis rozszerzający NotificationListenerService

No i pojawia się ten komunikat na pasku, chciał bym go zlikwidować @Roman Mokrzan
Poza tym w onStartCommand ja tworzę własną notyfikację. Która nie jest wyświetlana.

0

Na nowych Androidach nie uruchomisz takiego serwisu bez powiadomienia użytkownika. Tak to działa i tyle. zasadniczo całkiem słusznie, bo kiedyś na androidach latało Ci 20 apek w tle które nie wiadomo co robiły.

Pytanie jest co chcesz zrobić w samym serwisie tak żeby nie informować użytkownika. Może da się to załatwić jakimś Job-em albo innym mechanizmem

1 użytkowników online, w tym zalogowanych: 0, gości: 1