我正在开发一个与网络有很强关系的应用程序。它必须连接有强大的 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 时更改条形颜色(如红色)以通知用户。但我想知道是否有更好的方法来解决这个问题。
对于那些想知道我是如何做到的人。我使用 Job Scheduler 因为它是一个需要建立 wifi 连接的任务。
此外,您可以查看我的博客,您可以在其中找到有关此内容的更多详细信息和额外信息
首先,为每个活动声明一个文本视图。
<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"
/>
然后我创建一个 WfiJob 类,其中包含需要 NETWORK_TYPE_ANY 的 JobCheduler,并且每 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 ,它是一个接口,它将向活动广播消息,以便可以显示文本视图。
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);
}
}