作用 | 快捷键 |
---|---|
无干扰模式,编辑框全屏 | 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文件删除了,并且已修改好的代码没有上传到版本控制系统,这种感觉真是惊险又刺激(看到删除成功的时候欲哭无泪)
恢复办法:
2.点击Show History会出现所有你曾经修改过的文件名称,文件所在的目录,修改时间等信息。任意选择一项,右侧会出现那个时间点的版本与当前版本有差异的所有文件(绿色代表该文件是后来新增的,蓝色代表文件后来被修改过,灰色代表该文件后来被删除了)
2.1如果你想恢复任意时刻的版本状态,可以在左侧找到该时间点的版本,右键 >> Revert ,所有文件就恢复到了那个时间点所在的状态,如下图:
2.2当然你也可以选择某个时刻,选择该时刻下的文件,进行单个文件的恢复,同样选择文件,右键 >> Revert Selection 。Show Difference 查看文件与当前版本的不同之处
案例二
问题:AndroidStudio里面的提示功能,以及所有快捷键都失效了;
解决办法:
案例三
问题一
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
解决办法:
选中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做的检测,展现形式如下:
通过图片的信息,看不出具体是哪里造成的内存泄露,我最后是通过打断电的方式,在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)
解决办法:
在defaultConfig里面加入下面这段代码:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
未完待续~~~ 经验分享