Android安装好的app,如何实现修改IP地址(思路篇)

2017-12-19  本文已影响0人  赵小缺

首先回忆一下很久之前领导给的一个任务:项目用户(乡村医生)可能要求不用我们的服务器,而是用他们自己的电脑作为服务器,做一个局域网的本地的服务(用户对数据安全要求高),为了推广(还没上线,只是拿给用户使用)的时候演示方便,领导要求手机里头安装好的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之后会有一个重新启动的过程,感觉不太美观,但是毕竟功能不是直接给用户的,时间紧坑又多爬坑难,只能想到这一个办法了,所以如果有好办法的朋友可以分享给我,谢谢~。

上一篇下一篇

猜你喜欢

热点阅读