Android开发知识小集
注解
@SuppressLint
Lint是一个静态检查器,它围绕Android项目的正确性、安全性、性能、可用性以及可访问性进行分析。它检查的对象包括XML资源、位图、ProGuard配置文件、源文件甚至编译后的字节码。
Lint还包含了API版本检查、性能检查以及其他诸多特性。
其中可以使用@SuppressLint标注忽略指定的警告。
不想用的话,可以右键点工程,然后在android tools 中,选择 clear lint marker。
样式
背景透明
<LinearLayout
...
android:background="@android:color/transparent"
...>
</LinearLayout>
WebView
JS 调起的方法中,WebView 执行的 UI 相关操作需要在主线程处理
Js 调用 Java 方法时,不是在主线程 (Thread Name:main) 中运行的,而是在一个名为 JavaBridge 的线程中执行的,通过如下代码可以测试:
@JavascriptInterface
public void jsCallJava(String message){
Log.i("thread", Thread.currentThread().getName());
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
所以这里需要注意的是,当 Js 调用 Java 时,如果需要 Java 继续回调 Js,千万别在 JavascriptInterface 方法体中直接执行 loadUrl() 方法,而是进行线程切换操作,在主线程执行。
其次,使用 loadUrl() 方法实现 Java 调用 Js 功能时,也必须放置在主线程中,否则会发生崩溃异常。
另外,注意代码混淆时,记得保持 JavascriptInterface 内容,在 proguard 文件中添加如下类似规则 (有关类名按需修改):
keepattributes *Annotation*
keepattributes JavascriptInterface
-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface {
<methods>;
}
Cookie 的使用
Cookie 的格式
Set-Cookie: “name=value; domain=.domain.com; path=/; expires=Sat, 11 Jun 2016 11:29:42 GMT; HttpOnly; secure”
CookieManager 的 API
CookieManager cookieMgr = CookieManager.getInstance();
cookieMgr.setCookie("http://host.name/", "k1=v1;");
cookieMgr.setCookie("http://host.name/", "k2=v2;");
cookieMgr.setCookie("http://host.name/", "k3=v3;");
String result = cookieMgr.getCookie("http://host.name/");
// 结果为 "k1=v1; k2=v2; k3=v3;"
// setCookie 不能一次设置多个值,如 "k1=v1; k2=v2; k3=v3;",否则只有第一个 "k1=v1" 会被记录
UI
获取屏幕大小
//1、通过WindowManager获取(推荐)
final WindowManager w = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
final Display d = w.getDefaultDisplay();
final DisplayMetrics dm = new DisplayMetrics();
d.getMetrics(dm);
int heigth = dm.heightPixels;// 表示屏幕的像素高度,单位是px(像素)
int width = dm.widthPixels;// 表示屏幕的像素宽度,单位是px(像素)
//2、通过Resources获取
DisplayMetrics dm = getResources().getDisplayMetrics();
//这两个就是手机屏幕的屏幕分辨率,物理宽高值如1080*1920(ToolBar或ActionBar会占据一定空间,得到的heightPiexls会小一点)
int width = metrics.widthPixels;// 表示屏幕的像素宽度,单位是px(像素)
int height = metrics.heightPixels;// 表示屏幕的像素高度,单位是px(像素)
float density = metrics.density;// 显示器的逻辑密度,Density Independent Pixel(如3.0),(metrics.scaledDensity和metrics.density数值是一样的)
int densityDpi = metrics.densityDpi; // 整个屏幕的像素密度DPI(dots per inch每英寸像素数),可以是密度低,密度中等,或者密度高(如240/ 360 / 480)
float xdpi = metrics.xdpi;//表示在X轴方向上每英寸的像素值,X轴方向上的DPI(dots per inch)
float ydpi = metrics.ydpi;//表示在Y轴方向上每英寸的像素值, Y方向上的DPI
//3、获取屏幕的默认分辨率
Display display = getWindowManager().getDefaultDisplay();
int heigth = display.getWidth();
int width = display.getHeight();
//4、通过类直接取
getWindowManager().getDefaultDisplay().getMetrics(dm);
科普:
- DP(DIP),device independent pixels,长度单位(设备独立像素)。不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
- px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
- pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
- sp: scaled pixels(缩放像素). 主要用于字体显示best for textsize。
dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。
Gradle
指定文件路径
android {
// ···
sourceSets {
main {
jniLibs.srcDirs = ['libs']
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
// ···
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com
文章标题:Android开发知识小集
文章字数:1.3k
本文作者:Mingfung
发布时间:2019-12-18, 10:29:00
最后更新:2021-01-18, 15:06:27
原始链接:http://blog.ifungfay.com/uncategorized/Android开发知识小集/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。