首页 文章

这可能是Android上monitore Wifi信号强度的最佳方法

提问于
浏览
0

我正在开发一个与网络关系密切的应用程序 . 它必须与强大的wifi信号连接 . 我在开发应用程序时获得了一次体验,但它被用户拒绝了,因为它与网络有很强的关系,但是wifi网络不能很好地工作,所以用户指责应用程序并将其删除 .

现在我将开发一个新的应用程序,我想再次防止这种情况发生 . 首先,我正在扩展BroadcastReceiver,以便在连接丢失时通知应用程序 .

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的整数,表示从低到高的信号强度 .

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时,不断监视信号强度并改变条形颜色(如红色)以通知用户 . 但我想知道是否有更好的方法来解决这个问题 .

1 回答

  • 0

    对于那些想知道我是怎么做的人 . 我使用了Job Scheduler,因为它是一个需要 Build wifi连接的任务 .

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

    最后,我得到了
    enter image description here

    首先,声明每个活动的文本视图 .

    <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"
            />
    

    然后我创建了一个具有JobCheduler的Class WfiJob,它需要NETWORK_TYPE_ANY,并且它每5秒执行一次 .

    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,它是一个接口,它将向活动广播一条消息,以便显示textview .

    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);
    }
    }
    

    控制器订阅活动 .

    public class WifiJobSchedulerController {
    
    public void setWifiJobSchedulerControllerInstance(WifiJobScheduler.WifiStrenghtListener listener){
    
        WifiJobScheduler.wifiStrenghtListener = listener;
    }
    }
    

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

    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);
    }
    }
    

相关问题