AndroidStudio实用快捷键与经验分享

作用 快捷键
无干扰模式,编辑框全屏 View > Enter Distraction Free Mode
Run Shift+F10
Version Control Alt + 9
最大化/最小化编辑器 Control + Shift + F12
转到上一个编辑位置 Control + Shift + 退格键
调出设置对话框 Control + Alt + S
大小写切换键 Control + Shift + U
在当前Project查找文本 Control + Shift + F
案例1:

问题:
把项目main文件删除了,并且已修改好的代码没有上传到版本控制系统,这种感觉真是惊险又刺激(看到删除成功的时候欲哭无泪)
恢复办法:

1.找到删除的文件的上级目录,右键 >> Local History >> Show History ,如下图:
图1.png

2.点击Show History会出现所有你曾经修改过的文件名称,文件所在的目录,修改时间等信息。任意选择一项,右侧会出现那个时间点的版本与当前版本有差异的所有文件(绿色代表该文件是后来新增的,蓝色代表文件后来被修改过,灰色代表该文件后来被删除了)
图2.png

2.1如果你想恢复任意时刻的版本状态,可以在左侧找到该时间点的版本,右键 >> Revert ,所有文件就恢复到了那个时间点所在的状态,如下图:
图3.png

2.2当然你也可以选择某个时刻,选择该时刻下的文件,进行单个文件的恢复,同样选择文件,右键 >> Revert Selection 。Show Difference 查看文件与当前版本的不同之处
图4.png
案例二

问题:AndroidStudio里面的提示功能,以及所有快捷键都失效了;
解决办法:

将下图的省电模式选中后,再取消选中,就可以恢复了。
省电模式.png
案例三

问题一

Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.4.1/gradle-3.4.1.pom'. Received status code 400 from server: Bad Request
Enable Gradle 'offline mode' and sync project

解决办法:


setting.png

选中Enable embedded Maven repository 再Try Again,重新编译就ok了.

案例四

问题:

Unable to resolve dependency for :app@dexOptions/compileClasspath' ......

解决办法:
查看gradle.properties文件里面是否设置了代理,如果设置了就把代理设置删除,或者注释掉,再Try again,重新编译就ok。我的一开始有如下设置:

systemProp.https.proxyPort=80
systemProp.http.proxyHost=mirrors.neusoft.edu.cn
systemProp.https.proxyHost=mirrors.neusoft.edu.cn
systemProp.http.proxyPort=80

如果还有问题,下载不到相应的类库,就添加镜像源

在project build.gradle更改为

allprojects {
    repositories {
        maven {
            url "https://maven.aliyun.com/repository/google"
        }
        maven {
            url "https://maven.aliyun.com/repository/jcenter"
        }
    }
}

————————————————
版权声明:本文为CSDN博主「Core Studio」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csdn9228/article/details/90724284

案例五(项目实战):H5返回按钮不可用

电商平台:从H5页面下单后调用微信支付或者支付宝支付,支付后返回,重新启动另一个H5页面(订单列表界面),H5返回按钮不可用,不能回退到原来的下单界面。

原因:在支付结果界面返回后,重复新建了显示H5的Activity。
解决办法:
1、将显示H5的Activity的启动模式设置成singleTask,如果实例在栈内存在,再次启动的时候,就不会重新创建实例了,此时Activity就会回到栈顶,并且上面的实例会被移出栈。
2、重写Activity的onNewIntent方法,接收要显示的url。
注释以上设置就编译成功了。

案例六:使用腾讯X5内核引起的内存泄露

项目场景:
主程序中有四个下标,其中一个tab是展示的H5页面,为了在不同机型适配,使用的腾讯X5内核。H5页面与Android代码交互,Js调用Java方法,Android端给Js传入userId与经纬度。
@JavascriptInterface方法不是主线程进行的,所以此处业务需求,需要使用handler来将实现放到主线程执行。
用的LeakCanary做的检测,展现形式如下:


内存泄露展示图.png

通过图片的信息,看不出具体是哪里造成的内存泄露,我最后是通过打断电的方式,在onDestroy的时候,看哪个对象还不为null,再在onDestroy中添加相应的处理代码解决。
在Fragment的onDestroy()添加如下代码就解决了:

        if(handler != null){
            handler.removeMessages(1);
            handler = null;
        }
        try{
            if (webView != null) {
                webView.stopLoading();
                webView.removeAllViewsInLayout();
                webView.removeAllViews();
                webView.setWebViewClient(null);
                CookieSyncManager.getInstance().stopSync();
                webView.destroy();
                webView = null;
            }
        }catch (Throwable throwable){
            throwable.printStackTrace();
        } finally {
            javaScriptinterface = null;
            ToastUtil.makeNull();
            super.onDestroy();
        }
案例六:覆盖安装时解析包出错

这是接手公司代码的时候遇到的问题之一

private void jumpInstall() {
        File apkFile = new File(filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri apkUri = null;
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //判断版本是否是 7.0 及 7.0 以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            apkUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
            apkUri = Uri.fromFile(apkFile);
        }
        
        intent.setDataAndType(apkUri,
                "application/vnd.android.package-archive");
        startActivity(intent);
    }

仔细检查,发现是他原来的intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);写在了判断sdk版本之后。看源码:

public @NonNull Intent addFlags(@Flags int flags) {
        mFlags |= flags;
        return this;
}

public @NonNull Intent setFlags(@Flags int flags) {
        mFlags = flags;
        return this;
}

addFlags方法中mFlags |= flags;相当于mFlags = mFlags | flags;是将参数添加到mFlags后面;
setFlags方法是直接覆盖mFlags,那么之前设置的flags参数都无效,授权的设置被覆盖掉,所以出现解析包出错;

案例六:Error: Invoke-customs are only supported starting with Android O (--min-api 26)
报错截图.png

解决办法:
在defaultConfig里面加入下面这段代码:

compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
}

未完待续~~~ 经验分享

你可能感兴趣的:(AndroidStudio实用快捷键与经验分享)