首先回忆一下很久之前领导给的一个任务:项目用户(乡村医生)可能要求不用我们的服务器,而是用他们自己的电脑作为服务器,做一个局域网的本地的服务(用户对数据安全要求高),为了推广(还没上线,只是拿给用户使用)的时候演示方便,领导要求手机里头安装好的app可以点开之后直接修改Ip地址,省的再开电脑翻代码改IP刷机,如此显得很不专业。
分析功能:
一.这个功能不是给用户的,而是给演示人员用的,而且尽量避免用户本人使用到该功能。
二.项目网络请求库用的是Retrofit2,修改访问Ip大家马上就会想到下面代码
webInterface = new Retrofit.Builder()
.baseUrl(hostname)
.client(client)//这个client是OkHttpClient,以后和Okhttp的基本用法和流程分析中细说
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.build()
.create(WebInterface.class);
其中baseUrl(hostname),就是初始化ip地址的方法。所以很多同学想到直接修改hostname就可以完美的解决问题。我也是这么想的,但是里面很多坑!请接着往下看坑。
解决功能一:直接为登录界面的logo设置点击事件,连续点击三次才可以弹出的修改框;
switch (view.getId()) {
case R.id.id_ivIcon:
if (flag % 3 == 0) {
ipUtils.setIpConfig(LoginActivity.this);
}
flag++;
break;
image.png
ip地址由四部分组成,请看上图,请直接忽视openfire地址。
修改后的地址我们让它保存在文件中,以便修改框打开之后读取。
修改完成之后我们登陆下,发现日志中打印的登录地址依然是老地址,莫非我们文件存储和读取出了问题,马上去找手机中保存Ip的文件,文件存在且存储的就是新的Ip,读取到的也是新的IP,此时我们强制关闭app,再次点击进来,直接登录,发现访问的是文件中的IP,此时才算真正的修改成功。为什么会出现这种情况?其实:我们到了登录界面的时候已经初始化了Retrofit,并且baseUrl()已经传进去了老的url,所以怎么改地址,我们的访问地址都不会再变了,当强制关闭app后,会直接读取文件中的url传到baseUrl()中,所以只有一个办法——修改IP成功之后重启app,这样使用的才是新的url。需要写个重启app的类RestartAPPTool。
public class RestartAPPTool {
/**
* 重启整个APP
* @param context
* @param Delayed 延迟多少毫秒
*/
public static void restartAPP(Context context, long Delayed){
/**开启一个新的服务,用来重启本APP*/
Intent intent1=new Intent(context,killSelfService.class);
intent1.putExtra("PackageName",context.getPackageName());
intent1.putExtra("Delayed",Delayed);
context.startService(intent1);
/**杀死整个进程**/
android.os.Process.killProcess(android.os.Process.myPid());
}
/***重启整个APP*/
public static void restartAPP(Context context){
restartAPP(context,500);//我们传入500毫秒
}
}
现在反过来思考一个问题:既然是重启了app,当初选择用文件保存新的IP就是正确的选择,不然用什么保存?大家有别的建议么?
到这里我们的功能算是实现了,当然修改IP之后会有一个重新启动的过程,感觉不太美观,但是毕竟功能不是直接给用户的,时间紧坑又多爬坑难,只能想到这一个办法了,所以如果有好办法的朋友可以分享给我,谢谢~。
网友评论