Muszę stworzyć prostą aplikację, która działa zawsze, gdy działa telefon. Aplikacja powinna komunikować się z serwerem MQTT i pokazywać główne okno, gdy otrzyma wiadomość z serwera.

Utworzyłem nowy projekt z pustym działaniem i polem tekstowym. Ale jak poprosić system o uruchomienie mojej aplikacji podczas uruchamiania systemu i uruchomienie go w tle?

1
vico 20 listopad 2019, 14:19
 – 
Kartik Shandilya
20 listopad 2019, 14:22
Spodziewam się, że będziesz potrzebować usługi na pierwszym planie, która będzie wymagać wyświetlania stałego powiadomienia w zasobniku powiadomień. Jeśli nie zależy Ci na natychmiastowym otrzymywaniu wiadomości, lepszym rozwiązaniem będzie WorkManager.
 – 
PPartisan
20 listopad 2019, 14:33
Masz kilka rzeczy do przestudiowania i zaimplementowania w swoim kodzie. Pierwszy to Uruchomienie transmisji zakończone. Drugi to pracownik pętli w tle (lub wiele inne linki). Następnie należy [rozpocząć aktywność po wykryciu zdarzenia] (stackoverflow .com/questions/3606596/…). Powodzenia!
 – 
Pier Giorgio Misley
20 listopad 2019, 14:35

3 odpowiedzi

Oto dobra odpowiedź na temat uruchamiania usługi przy starcie urządzenia: Android – uruchom usługę przy starcie

W zależności od potrzeb dobrym pomysłem może być skorzystanie z usługi Foreground lub WorkManagera. Najnowsze pakiety SDK dla Androida mają wiele ograniczeń dotyczących usług działających w tle, głównie nie tego, co można zrobić w usłudze, ale raczej tego, jak długo może działać w tle. Oto kilka szczegółów na ten temat: https://developer.android.com/about/versions/oreo/background

Jeśli chodzi o otwarcie Aktywności po wydarzeniu wewnątrz usługi. Nie będzie to zgodne z wytycznymi i ograniczeniami Androida UX. W idealnym przypadku wszystkie zdarzenia/zmiany interfejsu użytkownika powinny mieć miejsce dopiero po działaniach użytkownika. Oto wskazówki: https://developer.android.com/guide/components/activities/background- zaczyna się

W twoim przypadku myślę, że najlepszym rozwiązaniem byłoby wyświetlenie użytkownikowi powiadomienia, po kliknięciu, które otworzy twoją aplikację / aktywność.

Tutaj możesz zobaczyć, jak wyświetlić powiadomienie z usługi i jak obsługiwać działania użytkownika dotyczące tego powiadomienia: https://developer.android.com/training/notify-user/build- powiadomienie Wysyłanie powiadomienia z usługi w Androidzie

2
Gegham Kurghinyan 20 listopad 2019, 14:44

Będziesz musiał utworzyć usługę w tle, aby rozmawiać z serwerem MQTT. Następnie musisz przekształcić tę usługę w tle w usługę pierwszego planu ze względu na ograniczenia zwane limitami wykonywania w tle, które zaczęły się od Androida Oreo.

Sprawdź ten link, aby lepiej zrozumieć: https://developer.android.com/ informacje/wersje/oreo/tło

Powinieneś także zakończyć działanie odbiornika przy starcie. Można to osiągnąć w pliku AndroidManifest.

Coś takiego.

<receiver android:name="com.example.StartUpBootReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>            
</receiver>

Mam nadzieję, że to ci pomoże i powodzenia!

0
Alex 20 listopad 2019, 14:40

Jeśli rozumiem Twoją prośbę, chciałeś utworzyć usługę działającą w tle i uruchamiać ją przy starcie systemu:

W manifeście dodaj to:

  <receiver
            android:name=".StartSysytemReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
  </receiver>

utwórz BroadcastReceiver:

public class StartSysytemReceiver extends BroadcastReceiver {

    private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
    private static final String QUICKBOOT_POWERON = "android.intent.action.QUICKBOOT_POWERON";


    @Override
    public void onReceive(Context context, Intent intent) {
        if (BOOT_COMPLETED.equals(intent.getAction()) ||
                QUICKBOOT_POWERON.equals(intent.getAction())) {


            //schedule your  background service 
            scheduleJob(context);

        }
    }
}

// harmonogram

 public  void scheduleJob(Context context) {
            FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
            RetryStrategy retryStrategy = dispatcher.newRetryStrategy(2, 300, 1800);
            Builder jobBuilder = dispatcher.newJobBuilder().setService(BackgroundJobService.class)
           .setTag("scheduleJob_112").setReplaceCurrent(true)
           .setRecurring(false).setLifetime(2)
           .setRetryStrategy(retryStrategy).setConstraints(new int[]{2});
            Job myJob = jobBuilder.build();
            dispatcher.mustSchedule(myJob);
          }

// backgroundJobService

public class BackgroundJobService extends JobService {
    private static final String TAG = "BackgroundJobService";
    boolean isWorking = false;
    boolean jobCancelled = false;

    public BackgroundJobService () {
    }

    public boolean onStartJob(JobParameters jobParameters) {
        this.isWorking = true;
         this.doWork(jobParameters);
        return this.isWorking;
    }

    private void doWork(JobParameters jobParameters) {
        if (!this.jobCancelled) {
          //callYour service her
            this.getBaseContext().startService(new Intent(this.getBaseContext(), ServiceToCall.class));
            this.isWorking = false;
            this.jobFinished(jobParameters, true);
        }
    }

    public boolean onStopJob(JobParameters jobParameters) {
        this.jobCancelled = true;
        boolean needsReschedule = this.isWorking;
        this.jobFinished(jobParameters, this.isWorking);
        return needsReschedule;
    }
}
0
MrZ 20 listopad 2019, 14:42