2017-03-14 1 views
0

Wie lautet der branchenübliche Weg, eine lang andauernde, ständig überwachte Aufgabe in Android zu implementieren?Welchen branchenüblichen Weg bietet eine lang andauernde, ständig überwachte Aufgabe in Android?

Zum Beispiel gibt es eine Möglichkeit, die Zellsignalstärke zu erhalten:

public void getData(){ 
    int cellSignalStrength = 0; 
    TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
    List<CellInfo> cellInfos = telephonyManager.getAllCellInfo(); 
    for(CellInfo info : cellInfos){ 
     if(info instanceof CellInfoCdma){ 
      cellSignalStrength = ((CellInfoCdma) info).getCellSignalStrength().getLevel(); 
     } else if(info instanceof CellInfoGsm){ 
      cellSignalStrength = ((CellInfoGsm) info).getCellSignalStrength().getLevel(); 
     } else if(info instanceof CellInfoLte){ 
      cellSignalStrength = ((CellInfoLte) info).getCellSignalStrength().getLevel(); 
     } else if(info instanceof CellInfoWcdma){ 
      cellSignalStrength = ((CellInfoWcdma) info).getCellSignalStrength().getLevel(); 
     } 
    } 
} 

Offensichtlich würde Ich mag diese ständig überwachen. Ist ein Timer mit TimerTask der "beste", industrie-bevorzugte Weg, um dies ständig zu überwachen?

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     getData(); 
    } 
}, 100); 

Oder gibt es eine andere, eine bessere Art und Weise, dies zu tun, wie eine while(true) Schleife innerhalb eines Android-Service?

Danke!

+0

Bitte definieren Sie, was "konstant" in diesem Zusammenhang bedeutet. Meinst du "ständig während meine Tätigkeit, die diese Daten benötigt, im Vordergrund steht"? – CommonsWare

+0

Ja, während die Aktivität im Vordergrund steht. Ich entschuldige mich dafür, dass ich das vergessen habe. –

Antwort

0

Es hängt ein bisschen von Ihrer geplanten Verwendung für die Daten ab.

Wenn Ihre primäre, wenn nicht einzige, Use-Case für die Daten Ihrer Benutzeroberfläche zu aktualisieren ist, und die Arbeit selbst ist billig (< 1ms zu verarbeiten), das billigste, was postDelayed() zu bedienen:

/*** 
    Copyright (c) 2012 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    Covered in detail in the book _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.post; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Toast; 

public class PostDelayedDemo extends Activity implements Runnable { 
    private static final int PERIOD=5000; 
    private View root=null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    root=findViewById(android.R.id.content); 
    } 

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

    run(); 
    } 

    @Override 
    public void onStop() { 
    root.removeCallbacks(this); 

    super.onStop(); 
    } 

    @Override 
    public void run() { 
    Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT) 
     .show(); 
    root.postDelayed(this, PERIOD); 
    } 
} 

Hier zeige ich einfach alle fünf Sekunden eine Toast, aber Sie können den Zeitraum und die Arbeit in der Runnable aktualisieren, um zu tun, was Sie brauchen.

Die Verwendung von postDelayed() verhindert, dass Hintergrundthreads erstellt werden und die Inter-Thread-Kommunikation mit dem Hauptanwendungs-Thread fortgesetzt werden muss, um die Benutzeroberfläche zu aktualisieren.

Wenn Ihre Arbeit teurer wird (z. B. Festplatten-I/O, Netzwerk-I/O), könnten Sie TimerTask verwenden, obwohl ich ScheduledExecutorService (Java um 1,4 hinzugefügt, flexibler) bevorzugen.

Sie sollten jedoch keinen Android-Dienst benötigen, wenn Sie diese Verarbeitung nur benötigen, wenn Ihre Aktivität im Vordergrund ist. Dienste dienen dazu, wenn Sie Arbeit haben, die erledigt werden muss, selbst wenn der Benutzer Ihre Benutzeroberfläche verlässt und in eine andere App geht.

+0

Danke für die Information. Ich werde beide Optionen untersuchen. –

Verwandte Themen