2017-04-20 1 views
0

Ich entwickle eine Anwendung, die eine starke Beziehung mit dem Netzwerk hat. Es muss mit einem starken WLAN-Signal verbunden sein. Ich habe die Erfahrung einmal, als ich eine Anwendung entwickelte, wurde es von den Benutzern abgelehnt, weil es auch eine starke Beziehung mit dem Netzwerk hatte, aber das WiFi-Netzwerk nicht sehr gut funktioniert, so dass die Benutzer die Anwendung beschuldigt und sie es auslassen.Welches ist der beste Weg zum Monitor Wifi Signalstärke auf Android

Jetzt werde ich eine neue Anwendung entwickeln und ich möchte verhindern, dass dies erneut passiert. Zuerst erweitere ich den BroadcastReceiver, damit die App benachrichtigt wird, wenn die Verbindung verloren geht.

public class ConnectivityReceiver extends BroadcastReceiver { 
public static ConnectivityReceiverListener connectivityReceiverListener = null; 
@Override 
public void onReceive(Context context, Intent intent) { 
    boolean isConnected = AppUtilities.getWifiConnectionStatus(context); 

    if(connectivityReceiverListener != null){ 
     connectivityReceiverListener.showMessageStatus(isConnected); 
    } 
} 

public interface ConnectivityReceiverListener { 

    void showMessageStatus(boolean status); 
} 


} 

Jetzt muss ich die Wifi-Signalstärke überwachen, um den Benutzer benachrichtigt, wenn das Signal niedrig geht. Ich habe bereits eine Methode, die die Signalstärke misst und eine Ganzzahl von 0 bis 4 zurückgibt, die die Signalstärke von niedrig nach hoch darstellt.

public static int getWifiStrengh(Context context){ 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    int numberOfLevels = 5; 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels); 
    return level; 
} 

nun auf den Punkt, ich will weicht wissen wird der beste Ansatz sein, ständig die Signalstärke zu überwachen.

Ich denke im Einsatz Job Scheduler, um ständig die Signalstärke zu überwachen und ändern die Balkenfarbe (wie ein roter), wenn die Signalstärke weniger als 2 ist, um den Benutzer benachrichtigt. Aber ich würde gerne wissen, ob es einen besseren Ansatz zur Lösung dieses Problems gibt.

Antwort

0

Für diejenigen, die wissen wollen, wie ich es gemacht habe. Ich habe Job Scheduler benutzt, weil es eine Aufgabe ist, die eine Wifi-Verbindung herstellen muss.

Außerdem können Sie my blog überprüfen, wo Sie weitere Informationen über diese und zusätzliche Informationen

Am Ende finden werden, habe ich diese enter image description here

Zuerst auf jeder Aktivität eine Textansicht erklären.

<TextView 
     android:id="@+id/messageLogin" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/wifitoSlow" 
     android:textColor="@color/magnitude0" 
     android:background="@color/magnitude7" 
     android:gravity="center" 
     android:visibility="gone" 
     /> 

Dann erstelle ich eine Klasse WfiJob, der die JobCheduler hat die NETWORK_TYPE_ANY erfordert, und es tut es alle 5 Sekunden.

public class WifiJob { 

public void createWifiJob(int jobNumber, Context context){ 
    //We are defining a jobObject that will have a jobNumber and a serviceName that will run only if a network connection exits 
    JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    jobScheduler.schedule(new JobInfo.Builder(jobNumber, new ComponentName(context.getApplicationContext(), WifiJobScheduler.class)) 
      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) 
      .setRequiresDeviceIdle(false) 
      .setPeriodic(5000).build()); 
} 
} 

Dann mein WifiJobScheduler, der von JobService erstreckt. Hier habe ich auch den WifiStrengthListener, der eine Schnittstelle ist, die eine Nachricht an die Aktivitäten sendet, damit die Textansicht angezeigt werden kann.

public class WifiJobScheduler extends JobService{ 


private static final String TAG = "SyncService"; 
public static WifiStrenghtListener wifiStrenghtListener=null; 
//private boolean messageIsShowed = false; 
//The onStartJob is performed in the main thread, if you start asynchronous processing in this method, return true otherwise false. 
@Override 
public boolean onStartJob(JobParameters params) { 
    Log.i(TAG, "on start job: " + params.getJobId()); 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    if(AppUtilities.isInteractive(pm)){ //if the device is active 
     int wifiStrenght = WifiUtilities.getWifiStrengh(getApplicationContext()); 
     Log.i(TAG, "wifi strengh ........... : " + wifiStrenght); 
     if(wifiStrenghtListener!=null){ 
      if(wifiStrenght<4 && !AppUtilities.messageIsShowed){ 
       wifiStrenghtListener.showSlowSignalOnTop(View.VISIBLE); 
       AppUtilities.messageIsShowed = true; 
      }else if(wifiStrenght>3 && AppUtilities.messageIsShowed){ 
       wifiStrenghtListener.showSlowSignalOnTop(View.GONE); 
       AppUtilities.messageIsShowed = false; 
      } 

     } 

    }else{ 
     cancelAllJobs(); 
     Log.i(TAG, "job canceled........"); 
    } 

    return false; // true if we're not done yet and we are going to run this on a thread 
} 

// If the job fails for some reason, return true from on the onStopJob to restart the job. 
@Override 
public boolean onStopJob(JobParameters params) { 

    return true; 
} 

public void cancelAllJobs() { 
    JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    tm.cancelAll(); 
} 

public interface WifiStrenghtListener{ 

    void showSlowSignalOnTop(int visible); 
} 
} 

Der Controller, um die Aktivitäten zu abonnieren.

public class WifiJobSchedulerController { 

public void setWifiJobSchedulerControllerInstance(WifiJobScheduler.WifiStrenghtListener listener){ 

    WifiJobScheduler.wifiStrenghtListener = listener; 
} 
} 

Und schließlich müssen Sie die Schnittstelle implementieren und die Aktivität abonnieren.

public class LoginActivity extends AppCompatActivity implements WifiJobScheduler.WifiStrenghtListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login);  
    //register wifistrenght status listener 
    new WifiJobSchedulerController().setWifiJobSchedulerControllerInstance(this); 
} 
    @Override 
public void showSlowSignalOnTop(int visible) { 
    TextView message = (TextView)findViewById(R.id.messageLogin); 
    message.setVisibility(visible); 
} 
} 
Verwandte Themen