Cum să faci o aplicație android să ruleze întotdeauna în fundal? (Programare, Android)

Manuel a intrebat.

Folosesc un dispozitiv android. Când deschid Settings > Apps > Running, există o opțiune în stânga sus a ecranului pentru a vedea : (1) Procese în curs de execuție (2) Procese din fundal în cache. Iar aplicația (aplicațiile) pe care am vrut să ruleze mereu (24×7) este/sunt, din păcate, listată(e) la (2) Cached background processes, pe când eu aș fi vrut ca ea/ele să fie listată(e) la (1) Running processes (dacă este posibil). Se poate face acest lucru? Sau, pe scurt, cum se poate face ca o aplicație android să ruleze mereu în fundal?

Sper că am transmis întrebarea 🙂

Comentarii

  • Puteți încerca să creați un serviciu. Aici este documentația oficială pentru a face acest lucru: Link –  > Por JP_.
  • pentru API-uri noi puteți folosi acest truc 😉 : stackoverflow.com/a/49878237/2201814 –  > Por MHSFisher.
3 răspunsuri
sembozdemir

Trebuie să porniți un serviciu în clasa Aplicație pentru a-l rula întotdeauna. dacă faceți acest lucru, serviciul dvs. va fi întotdeauna în funcțiune. Chiar dacă utilizatorul termină aplicația dvs. din managerul de activități sau forțează oprirea aplicației, aceasta va începe să ruleze din nou.

Creați un serviciu:

public class YourService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // do your jobs here
        return super.onStartCommand(intent, flags, startId);
    }
}

Creați o clasă Application și porniți serviciul:

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        startService(new Intent(this, YourService.class));
    }
}

Adăugați atributul „name” în tag-ul „application” din AndroidManifest.xml.

android:name=".App"

De asemenea, nu uitați să adăugați serviciul dvs. în eticheta „application” din AndroidManifest.xml

<service android_name=".YourService"/>

Și, de asemenea, această cerere de permisiune în tag-ul „manifest” (dacă nivelul API 28 sau mai mare):

<uses-permission android_name="android.permission.FOREGROUND_SERVICE"/>

UPDATE

După Android Oreo, Google a introdus unele limitări în fundal. Prin urmare, această soluție de mai sus nu va funcționa probabil. Atunci când un utilizator vă ucide aplicația din task manager, Android System va ucide și serviciul dvs. Dacă doriți să rulați un serviciu care este mereu în viață în fundal. Trebuie să rulați un serviciu în prim-plan care să afișeze o notificare în curs de desfășurare. Așadar, editați serviciul dvs. ca mai jos.

public class YourService extends Service {

    private static final int NOTIF_ID = 1;
    private static final String NOTIF_CHANNEL_ID = "Channel_Id";

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

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

        // do your jobs here

        startForeground();
        
        return super.onStartCommand(intent, flags, startId);
    }

    private void startForeground() {
        Intent notificationIntent = new Intent(this, MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);

        startForeground(NOTIF_ID, new NotificationCompat.Builder(this, 
                NOTIF_CHANNEL_ID) // don't forget create a notification channel first
                .setOngoing(true)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText("Service is running background")
                .setContentIntent(pendingIntent)
                .build());         
    }
}

MODIFICARE: OEMS RESTRICȚIONAT

Din păcate, unii OEM (Xiaomi, OnePlus, Samsung, Huawei etc.) restricționează operațiunile din fundal datorită asigurării unei durate de viață mai lungi a bateriei. Nu există o soluție adecvată pentru aceste OEM-uri. Utilizatorii trebuie să permită anumite permisiuni speciale care sunt specifice pentru OEM-uri sau trebuie să adauge aplicația dvs. în lista de aplicații din lista albă prin setările dispozitivului. Puteți găsi mai multe informații detaliate la https://dontkillmyapp.com/.

Dacă operațiunile în fundal reprezintă o obligație pentru dvs., trebuie să le explicați utilizatorilor de ce nu funcționează funcția dvs. și cum pot activa funcția dvs. prin acordarea acestor permisiuni. Vă sugerez să utilizați biblioteca AutoStarter (https://github.com/judemanutd/AutoStarter) pentru a redirecționa cu ușurință utilizatorii dvs. în ceea ce privește pagina de permisiuni din aplicația dvs.

Apropo, dacă aveți nevoie să executați o activitate periodică în loc să aveți o activitate continuă în fundal. Ar fi bine să aruncați o privire la WorkManager (https://developer.android.com/topic/libraries/architecture/workmanager)

Comentarii

  • Vă mulțumim. Dar, cum se creează un serviciu? Există o aplicație potrivită pentru asta? Scuzați-mă, pentru că sunt doar un începător… Poate u oferi un ghid pas cu pas chiar de la început? –  > Por Manuel.
  • Faceți clic dreapta pe aplicația din exploratorul de proiecte (în stânga în Android Studio). Și apoi, New >> Service >> Service –  > Por sembozdemir.
  • Android studio este un IDE (Integrated Development Environment). Trebuie să îl folosiți (sau Eclipse IDE) pentru a programa aplicații Android. Este un program care rulează pe desktop (Windows, Mac sau Linux). „App” este un dosar din cadrul fișierelor de proiect care se găsește în Project Explorer din partea stângă. Am lămurit lucrurile? –  > Por Anish Muthali.
  • Codul dvs. m-a făcut să mă îndrept în direcția cea bună – și, în sfârșit, să ajung la o soluție. Mulțumesc, , colega!!! @sembozdemir –  > Por SilSur.
  • @sembozdemir Am încercat soluția ta cu Android 8.1. Nu funcționează. Adică, odată ce am „Force Stop” aplicația mea din aplicația Setări, aplicația nu se repornește automat și trebuie să o repornesc în continuare manual. Cu ce versiune de Android ai testat soluția ta? Din câte am înțeles, odată ce o aplicație este oprită, serviciile sale cu același proces ar trebui să se oprească și ele, altfel este un defect de proiectare. –  > Por jonathanzh.
Tad

Pe unele telefoane mobile, cum ar fi al meu (MIUI Redmi 3), puteți adăuga doar o anumită aplicație pe lista în care aplicația nu se oprește atunci când terminați aplactions în Task Manager (Se va opri, dar va porni din nou)

Doar du-te la Setări>PermisiuniAutostart

Comentarii

  • Da, aveți dreptate. În unele telefoane, cum ar fi Mi și Vivo, trebuie să modificăm setările și să acordăm aplicației permisiunea specială de a rula în fundal din aplicația de setări. Chiar dacă ați făcut un serviciu care se repornește automat atunci când aplicația este închisă, serviciul nu va rula până când și dacă nu setați permisiunile în aplicația de setări a telefonului. –  > Por Gaurav Bharti.
  • pot cere această permisiune din aplicația mea sau va trebui să îi spun utilizatorului să meargă manual și să schimbe setările? –  > Por ColdSpike.
H.D.

In mi și vivo – Utilizarea soluției de mai sus nu este suficientă. Trebuie să de asemenea, spuneți utilizatorului să adauge permisiunea manual.Îl puteți ajuta deschizând locația corectă în setările telefonului. Variază pentru diferite modele de telefon.

Comentarii

  • Vă rugăm să elaborați „add permission”. –  > Por Rohit Surwase.
  • @RohitSurwase permisiunea IGNORE_BATTERY_OPTIMIZATIONS poate rezolva această problemă. Dar oppo-ul meu, ucide aplicația indiferent de toate aceste modificări de setări. Așa că a trebuit să recurg la serviciul de prim-plan. –  > Por Anirudh Ganesh.

Tags: