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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,239评论 2 33
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,178评论 6 13
  • 我发现很多人在谈改变的时候,都会走到一个地方:思维方式。在现代劳动力个性化输出的时代,貌似一个人如果不及时的跟上或...
    号角和木鱼阅读 508评论 0 1