以下为一些安卓中常见的注意点,不定时更新
1.注意申明
android:sharedUserId="android.uid.system"
2.去除Manifest中的申明,apk会隐藏安装图标
3.在Activity外驱动startActivity,需要给intent加上FLAG_ACTIVITY_NEW_TASK的flag,此常见于AndroidJunit测试中打开activity,否则会报如下错误
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
4.判断是否有相应权限
context.checkCallingOrSelfPermission("android.permission.READ_PHONE_STATE") == PackageManager.PERMISSION_GRANTED
5.raw下文件的uri
"android.resource://" + APP的context.getPackageName() + "/" + R.raw.文件
6.隐藏导航键等控件的情况下,需要获取屏幕分辨率,使用以下方法:
WindowManager wm = (WindowManager) (borderImageActivity.this.getSystemService(Context.WINDOW_SERVICE)); Point point = new Point(); wm.getDefaultDisplay().getRealSize(point); int width = point.x; int height = point.y;
以下两种方法无法获取隐藏之后最大屏幕的分辨率:
一:
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metrics.widthPixels; int height = metrics.heightPixels;
二:
Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); int width = dm.widthPixels; int height = dm.heightPixels;
7.设置activity横屏显示,加上
android:screenOrientation="landscape"
8.监听横屏竖屏切换,manifest中加上(一次性加上所有,免得一条一条加)
android:configChanges="orientation|keyboard|layoutDirection|screenSize"
然后Activity中重写onConfigurationChanged方法,示例如下:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ Toast.makeText(getApplicationContext(), "横屏", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getApplicationContext(), "竖屏", Toast.LENGTH_SHORT).show(); } }
9.使用instrumentation的时候,如果需要使用uiautomator,在初始化UiDevice的时候,需要使用adb 的命令为adb shell am instrument -w ,要加上-w才能成功初始化UiDevice对象,否则会报空指针异常错误
10.uiautomator中,如果同时使用python-uiautomator和安卓-uiautomator,使用安卓前,要关闭手机ATX的uiautomator服务,否则用安卓uiautomator测试,会出现以下的错误
UiAutomationService android.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy@8c48bd6already registered!
11.控件与边缘距离,
注意 android:layout_alignParentStart与android:layout_marginStart区别
12.代码将mm换算为像素
像素= TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM,(float)毫米,getResources().getDisplayMetrics());
13.自定义dialog去除蒙层(后部阴影)
自定义dialog.getWindow().setDimAmount(0f);
14.Bitmap设置背景透明(注意设置为ARGB_8888,不要用565,图片PNG带alpha通道)
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//设置位图的宽高 bitmap.setHasAlpha(true);
15Bitmap设置背景为图片
Drawable drawable=getResources().getDrawable(R.drawable.linecross); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; bitmap = Bitmap.createBitmap(width,height,config); canvas = new Canvas(bitmap); bitmap.setHasAlpha(true); drawable.setBounds(0, 0, width, height); drawable.draw(canvas);
16.编译后修改APK名称
build.gradle中配置
android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = "名称.apk" } }
17.TextView设置可滑动
TextView.setMovementMethod(ScrollingMovementMethod.getInstance());
18.安卓28中非https访问
28限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
所以GET请求会得到
not permitted by network security policy
解决办法:res-xml中加入如network_security.xml
然后在manifest的application中,加入
android:networkSecurityConfig="@xml/network_security.xml"
19.安卓两种hidl访问hal的方式
1.manifest中配置
false:代表系统无此包也可以执行APK,true则相反
通过访问系统自带的jar包,然后反射jar包所在类,通过jar包访问hal
2 .工程中导入.hal编译出的jar包,直接使用jar包访问hal