美文网首页android
Android动态切换服务器地址

Android动态切换服务器地址

作者: 小杜v587 | 来源:发表于2018-11-23 11:43 被阅读0次
    需求场景

    因独立开发,要对接好几个后台,和测试。而后台的本机地址都不一样,所以要联调的话需要给每个人不同的包。那么如果能在一个已安装的包下,实现切换和修改IP地址就好啦。

    但需要注意的是,这个功能是给测试和开发用的,正式上记得把这个功能隐藏掉。

    虽然想法很简单,但也踩了几个坑。

    1.我项目中的Retrofit2,本想着修改baseurl就万事大吉,经测试,虽然修改了,但是没有生效。因为在程序启动的时候,就已经初始化了Retrofit,而且baseurl已经传入了老的URL。想到了一个办法就是-保存完地址直接重启app。

    重启工具类如下

    /**
     * @作者: xiaodu
     * @时间: 2018/11/22
     * @描述:重启app
     */
    public class RestartAPPTool {
        /**
         * 重启整个APP
         * @param context
         * @param Delayed 延迟多少毫秒
         */
        public  static void restartAPP(Context context, long Delayed){
    
            /**开启一个新的服务,用来重启本APP*/
            Intent intent=new Intent(context,KillSelfService.class);
            intent.putExtra("PackageName",context.getPackageName());
            intent.putExtra("Delayed",Delayed);
            context.startService(intent);
    
            /**杀死整个进程**/
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    
        /***重启整个APP*/
        public static void restartAPP(Context context){
            restartAPP(context,500);//我们传入500毫秒
        }
    }
    
    
    /***
     * 该服务只用来让APP重启,生命周期也仅仅是只是重启APP。重启完即自我杀死
     * 记得在Manifest文件中添加KillSelfService
     */
    public class KillSelfService extends Service {
        /**
         * 关闭应用后多久重新启动
         */
        private static long stopDelayed = 2000;
        private Handler handler;
        private String PackageName;
    
        public KillSelfService() {
            handler = new Handler();
        }
    
        @Override
        public int onStartCommand(final Intent intent, int flags, int startId) {
            stopDelayed = intent.getLongExtra("Delayed", 2000);
            PackageName = intent.getStringExtra("PackageName");
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(PackageName);
                    startActivity(LaunchIntent);
                    KillSelfService.this.stopSelf();
                }
            }, stopDelayed);
            return super.onStartCommand(intent, flags, startId);
        }
    
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
    }
    

    2.主要的实现代码。

      //使用sp记录下来
      SPUtils.getInstance("test", MainActivity.this).put("ip", text);
    
      //延时1秒重启app,让sp能保存值
      new Handler().postAtTime(new Runnable() {
                @Override
                 public void run() {
                      //TODO("如果你用的是Retrofit2,不重启ip地址切换不会生效")
                      //重启app
                      RestartAPPTool.restartAPP(MainActivity.this);
                  }
        },1000);
    

    至此,动态切换地址已经完成,我把这个功能写在了登录页一个不起眼的位置上,点击3次可出现修改地址的功能。当然您也可以用摇一摇的方式来实现。
    最后,附上我的git地址

    相关文章

      网友评论

        本文标题:Android动态切换服务器地址

        本文链接:https://www.haomeiwen.com/subject/ymadqqtx.html