首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android上监控Wifi信号强度最好的方法是什么

在Android上监控Wifi信号强度最好的方法是什么
EN

Stack Overflow用户
提问于 2017-04-21 06:24:34
回答 1查看 177关注 0票数 0

我正在开发一个与网络有很强关系的应用程序。它必须连接到一个强大的wifi信号。我曾经有过这样的经历,当我开发一个应用程序时,它被用户拒绝了,因为它也与网络有很强的联系,但wifi网络工作得不是很好,所以用户责怪应用程序,他们放弃了它。

现在我将开发一个新的应用程序,我想防止这种情况再次发生。首先,我扩展了BroadcastReceiver,这样当连接丢失时,应用程序就会收到通知。

代码语言:javascript
复制
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);
}


}

现在,我需要监控wifi信号强度,以便在信号变低时通知用户。我已经有了一个测量信号强度的方法,并返回一个从0到4的整数,该整数表示信号强度从低到高。

代码语言:javascript
复制
    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;
}

现在进入正题,我想知道哪种方法是持续监测信号强度的最佳方法。

我正在考虑使用作业调度程序不断监测信号强度,并在信号强度小于2时改变条形颜色(如红色)来通知用户。但我想知道是否有更好的方法来解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2017-04-22 06:47:30

对于那些想知道我是怎么做到的人。我使用了Job Scheduler,因为这是一个需要建立wifi连接的任务。

此外,您还可以查看my blog,在那里您可以找到有关此内容的更多详细信息和其他信息

最后,我得到了这个

首先,在每个活动上声明一个文本视图。

代码语言:javascript
复制
<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"
        />

然后,我创建了一个拥有需要NETWORK_TYPE_ANY的JobCheduler的WfiJob类,它每5秒执行一次。

代码语言:javascript
复制
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());
}
}

然后是我从JobService扩展的WifiJobScheduler。在这里,我还有一个WifiStrenghtListener,它是一个向活动广播消息的接口,因此可以显示文本视图。

代码语言:javascript
复制
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);
}
}

控制器订阅活动。

代码语言:javascript
复制
public class WifiJobSchedulerController {

public void setWifiJobSchedulerControllerInstance(WifiJobScheduler.WifiStrenghtListener listener){

    WifiJobScheduler.wifiStrenghtListener = listener;
}
}

最后,您需要实现接口并订阅活动。

代码语言:javascript
复制
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);
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43530912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档