1.获得屏幕的高度和宽度
width=context,getResources().getDisplayMetrics().widthPixels;
height=context.getResources().getDisplayMetrics().heightPixels;
2.在Android Studio中隐藏ActionBar的方法。
getSupportActionBar().hide() 不可以使用getActionBar().hide()。会报空指针异常。
3.onDraw()方法什么时候执行
onDraw实在View初始化完成之后开始调用
postInvalidate()是重绘的,也就是调用postInvalidate()后系统会重新调用onDraw方法画一次
4.绘制渐变圆
Shader mShader=new SweepGradient(圆形x,圆形y,Color.TRANSPARENT, Color.parseColor("#AAAAAAAA"));
paint.setShader(mShader); //设置在绘制的过程中进行渐变
5 canvas.concat(matrix);
canvas.concat()的作用可以理解成对matrix的变换应用到canvas上的所有对象
6.JSON数据中,集中符号的表示意思:
{}:大括号表示对象
[ ] : 中括号表示数组
“ ” :双引号内是属性或值
:: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
例如:{“name” : "Michael"}可以理解为是一个包含name为Michael的对象
[{“name”: "Michael"}, {"name" : "sanshi"}] 就表示包含两个对象的数组
第二句也可以使用以下的代码表示:
{“name” : ["sanshi" , "Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象
7. JSON解析的三种方式
第一. 传统的JSON解析 可以把json字符串解析为一个javabean,一个List数组,一个嵌套Map的List数组
第二. GSON解析 Gson.fromJson(jsonString , cls);
第三. FastJson解析 JSON.parseObject(jsonString, cls);
8. EditText中常见但是不常用的属性
android:textCursorDrawable="@null" 这个属性是用来控制光标的颜色
“@null” 作用是让光标颜色和text color颜色一样
android:cursorVisible="false" 隐藏edittext闪烁的光标
android:paddingLeft=“10dp” 需要在EditText输入的时候左起位置和自动换行后每行的左起位置都能空出10dp
9.ListView各个条目之间如何留有一定的空隙
android:dividerHeight="10dp" 各个条目之间上下的间隔为10dp
10. android:autoLink: 设置是否当文本为URL链接、email、电话号码、map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
android:autoText 如果设置,将自动执行输入值的拼写纠正。
android:digits 设置允许输入哪些字符,如果“123456789”
android:ellipsize 设置当文字过长时,该空间该如何显示,有如下值设置: “start”—-?省略号显示在开头; "end" —-省略号显示在结尾; “middle”—省略号显示在中间,“marquee”—-以跑马灯的方式显示(动画横向移动)
android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
android:hintText 为空是显示的文字提示信息,可通过textColorHint设置提示信息的颜色。
android:ems 设置TextView的宽度为N个字符的宽度
android: textAppearance设置文字的外观
如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,
?表示系统是否有这种外观,否则使用默认的外观。
可设置的值如下:
textAppearanceButton/
textAppearanceInverse/
textAppearanceLarge/
textAppearanceLargeInverse/
textAppearanceMedium
android:textScaleX 设置文字之间间隔,默认为1.0f
android:textStyle 设置字形[bold 粗体 0, italic 斜体 1,bolditalic(又粗又斜) 2] 可以设置一个或多个,用" | " 隔开
11.RatingBar的使用
RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定,使用RaingBar的默认大小时,用户可以触摸/拖动或使用键来设置评分,它有两种样式,一种是ratingBarStyleSmall,大风格用于ratingBarStyleIndicator。其中大的只适合指示,不适合于用户交互。
几个重要的属性:
android:isIndicator RatingBar是否是一个指示器,
android:numStars 显示星型数量,必须是一个整形值,像“100”
android:rating 默认的评分,必须是浮点类型,像“1.2”
android:stepSize 评分的步长,必须是浮点类型,像“1.2”
12.FragmentActivity 与Activity的区别
1.FragementActivity继承自Activity,用来解决Android3.0之前无法使用Fragment的问题,所以在使用的时候需要导入android-support-v4.jar兼容包,同时继承FragmentActivity,这样在Activity中就能嵌入Fragment来实现你想要的布局效果
2. 当然Android3.0之后你就可以直接继承自Activity,并且在其中嵌入使用Fragment
3. 获得FragmentManager的方式也不同
android 3.0 以下 : getSupportFragmentManager();
android 3.0以上: getFragmentManager();
13. onLayout(boolean changed, int l, int t, int r , int b)各个参数的作用:
参数changed表示view有新的尺寸或位置
参数 l 表示相对于父view的Top位置
参数 r 表示相对于父vie的right位置
参数 b 表示相对于父view的Bottom位置
14.为什么自定义View中onLayout方法被执行两次是怎么回事
如果父视图的子视图的个数为0,就会执行一次。否则就会执行多次。因为开始时父视图中是没有子视图的。但是当你从xml文件中加载子视图或者或者在Java代码中添加子视图时,父视图的状态会发生变化,这个变化会引起onLayout甚至onMeasure.
15.Application中的两个获取Context方法的区别getApplication() 和 getApplicationContext()
getApplication() 与 getApplicationContext() 这两个获取Application实例的方法,在Activity和service中是没有没有任何区别的,但是getApplicationContext()的作用范围比getApplication()的作用范围更广,例如在BroadcastReceiver中也想获得Application实例,就不能使用getApplication(), 就只能使用getApplicationContext()方法了。意思就是说,getApplicationContext的作用范围更广,任何一个Context,都可以使用getApplicationContext()方法拿到我们的Application对象。
16. ListView加载网络图片的问题
每当有新的图片进入界面时,就会回调getView()方法,而在getView()方法中会开启异步请求从网络上获取图片,注意网络操作都是比较耗时的,也就是说当我们快速滑动ListView的时候就很有可能出现这样一种情况,某一个位置上的元素进入屏幕后开始从网络上请求图片,但是还没等图票下载完成,他就又被移出了屏幕。这种情况下会产生什么样的现象呢? 根据ListView的工作原理,被移出屏幕的控件将会很快被新进入屏幕的元素重新利用起来,而如果在这个时候刚好前面发起的图片请求有了响应,就会将刚才位置上的图片显示到当前位置上,因为虽然他们位置不同,但都是共用的同一个ImageView实例,这样就出现了图片乱序的情况。但是还没有完结,新进入屏幕的元素他也会发起一条网络请求来获取当前位置的图片,等到图片下载完的时候会设置到同样的ImageView 上面,因此就会出现先显示一张图片,然后有变成另外一张图片的情况。
17. 请使用命令行的方式创建一个名字为myAvd , sdk版本为2.2 , sd卡是在d盘的根目录下,名字为scard.img, 并制定屏幕大小为HVGA
答案:android create avd -n myAvd -t 2.2 -s HVGA -c d:\scard.img
选项中 -t : target新的AVD的Target ID(必须)
-c : sdcard指向一个共享的SD存储卡的路径或是为新的AVD定制新的SD卡的容量大小
-p : path新AVD将被创建的位置路径
-n : name新AVD的名称
-f : force强制创建(覆盖已存在的AVD)
-s : skin 新AVD的皮肤
18. 手机屏幕关于VGA、QVGA、WVGA、HVGA的区别
VGA: 即“Video Graphics Array”。是IBM推出的。具有分辨率高,显示速率快,颜色丰富等优点。
QVGA:是VGA的四分之一尺寸,在液晶屏幕上输出的分辨率是240*320.支持屏幕旋转。由HandEra公司发布,多用于手持/移动设备。
WVGA:即“Wide VGA”。其分辨率为800*480像素。是扩大了VGA(640*480)的分辨率。应用于PDA和手机等,WVGA 的屏幕更适合与浏览网页,可以说是未来手持的分辨率的大趋势。
HVGA:是VGA的一半,分辨率是480*320,他适用于各种各样的PDA设备。
19. Android中的IPC机制(进程间的通信)
IPC是内部进程通信的简称,是共享“命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Service端实现IPC接口,Client端调用IPC接口本地代理。
20. NDK是什么?
NDK是一系列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和Java应用打包成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so.
21. afinal 支持断点续传。
afinal是一个开源的android的orm和ioc应用开发框架,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm,无需任何配置信息,一行代码就可以对android的splite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。
主要组件,FinalHttp : 用于请求http数据,直接ajax方式请求,文件上传,断点续传下载文件等
FinalBitmap: 用于显示bitmap图片,而无需考虑线程并发和oom等问题
FinalActivity : 完全可以通过注解方式绑定控件和事件,无需编写代码
FinalDb : android中sqlite的orm框架,一行代码搞定增删改查
22. 获取应用程序中的最大可用内存
int maxMemory = (int)Runtime.getRuntime().maxMemory();
23. Bitmap 与Drawable的区别
Bitmap :称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888.作为一种主限速的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。
Drawable : 作为Android下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变,图形等。
详解:A bitmap is a drawable . A Drawable is not necessarily a bitmap ,Like all thumbs are fingers but not all fingers are thumbs;
Drawable在内存占用和绘制速度这两个非常关键的点上胜过Bitmap
怎么把bitmap转换成Drawable?
BitmapDrawable drawable = new BitmapDrawable(getContext().getResources(), bitmap);
24.设置ListView每个条目之间的间隔
android:divider="@color/background";
android:dividerHeight="10dp"
25.在使用svn进行提交代码的时候,注意备注的日志信息不能够为空,如果为空的话在会提示提交不成功,还得重新提交。切记。
26. 在使用Gson解析json字符串的时候,怎么建立JavaBean 是非常关键的。要注意一下三点,
第一. 内部嵌套的类必须是static的,要不然解析会出错。
第二. 类里面的属性名必须跟json字段里面的key是一模一样的。
第三. 内部嵌套的用[], 括起来的部分是一个List, 所以定义为public List<B> b. 而只用{}嵌套的就定义为public C c;
请看如下代码:
json字符串 :
String json = {
"a":"100",
"b":[{"b1":"b_value1","b2":"b_value2"},
{"b1":"b_value1","b2":"b_value2"}],
"c": {"c1":"c_value1","c2":"c_value2"}
}
相对应的Bean类为:
public class JsonBean{
public String a;
public List<B> b;
public C c;
public static class B{
public String b1;
public String b2;
}
public static class C{
public String c1;
public String c2;
}
}
27. 在程序代码中如何获取手机的信息
TelephonyManager tm=(TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
String mtyb=android.os.Build.BRAND; //手机品牌
String mtype=andoid.os.Build.MODEL; //手机的型号。
String number= tm.getLine1Number(); //手机号码
String serviceName=tm.getSimOperatorName(); //运营商
28. 一般情况EditText控件,默认的对齐方式是居中对齐。android:gravity="center". 如果我们想要EditText的光标在左上角提示的话,我们必须把下面这个属性设置为:android:gravity=“top”
29.getPackageManager();的方法使用
通过Activity的getPackageManager()方法可以得到PackageManager的对象
1.PackageManager 的getInstalledPackages(int flags)方法可以得到所有安装在机器上的程序的包信息类对象List<PackageInfo>,PackageInfo类中有一值applicationInfo可以得到Application的对象。
2.PackageManager的getInstalledApplications(int flags)方法可以得到所有安装在机器上的程序的application对象List<ApplicationInfo>;
30.自定义异常是捕获一个try/catch中出现的异常,这些异常会在网站的“异常报告”区域显示查看,您可以调用一下方法实现:
TestinAgent.uploadExcepiton(Context context , String message, Throwable throwable);
TestinAgent.uploadExcepiton(getApplicationContext(), String message, Throwable throwable);
31. "application/vnd.android.package-archive" 是文件类型,具体对应apk类型
32. EditText获取焦点的方法,下面的三个属性必须同时设置:
private TextView password=null;
password.setFocusable(true);
password.setFocusableInTouchMode(true);
password.requestFocus();
33. TextView使用了ellipase这个属性,怎么判断文字是否超过的文本框的界限,出现了神略号:
Layout layout=((TextView) findViewById(R.id.doctor_details_be_good)).getLayout(); if(layout != null){int lines=layout.getLineCount();if(lines >0){if(layout.getEllipsisCount(lines-1)>0){ToastUtils.showLongToast(DoctorDetailsActivity.this,"出现了省略号");}else{ToastUtils.showLongToast(DoctorDetailsActivity.this,"没有出现省略号");} }}
34. android中界面上要显示价格,怎么保留两位小数:
DecimalFormat df=new DecimalFormat("0.00");
df.format(价格);
35.怎么在不要使用的文字中间加上下划线:
textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
36. 在实际开发中LayoutInflater这个类是非常有用的,他的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化。而findViewById()是找xml布局文件下的具体widget控件。具体的作用:
1.对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.infalte()来载入;
2.对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。
获得LayoutInflater实例的三种方式:
1.LayoutInflater inflater=getLayoutInflater(); //调用Activity的getLayoutInflater()方法
2. LayoutInflater inflater=LayoutInflater.from(context);
3. LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context,LAYOUT_INFLATER_SERVICE);
37.SpannableString种属性的含义:
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE : 前后都不包括
Spanned.SPAN_INCLUSIVE_EXCLUSIVE : 前面包括,后面不包括
Spanned.SPAN_EXCLUSIVE_INCLUSIVE : 前面不包括,后面包括
Spanned.SPAN_INCLUSIVE_INCLUSIVE : 前后都包括
38.Bitmap 与 Drawable 之间的相互转换
① Bitmap转换为Drawable
Drawable drawable= new BitmapDrawable(bmp);
② Drawable 转换为Bitmap
Resources res=getResources();
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.sample_0);
39. 显示电话号码,以这样的形式显示133****1266
以133****1266的形式显示电话号码
//以153****0000的形式显示电话号码
public String showTelPhone(String mobile) {
String str = "";
for (int i = 0; i < mobile.length(); i++) {
if (i == mobile.length() – 11) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 10) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 9) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 4) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 3) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 2) {
str += mobile.charAt(i);
} else if (i == mobile.length() – 1) {
str += mobile.charAt(i);
} else {
str += "*";
}
}
return str;
}40. 在页面上显示,显示一段文字,以不同颜色显示:
String explain="<font color=\"gray\">如需换绑手机号,请确保您已安装</font>" +
"<font color=\"red\">UTOUU客户端</font>" +
"<font color=\"gray\">,并在UTOUU客户端中购买</font>" +
"<font color=\"red\">\"马良神笔\"</font>" +
"<font color=\"gray\">道具进行手机号的换绑</font>" ;
tv_unBoundExplain.setText(Html.fromHtml(explain));
41. EventBus 自己个人理解EventBus注解:
学了这么久,终于学会了怎么使用注解。
在进行手机绑定手机号的时候,使用了一次。
使用场景,点击绑定手机号,进入绑定手机号的页面,输入正确的验证码后,返回到设置界面,再去点击实名认证,因为界面没有刷新所以读取到Mobind还是错误的。这时需要刷新一下界面。读取到最新的Mobind值。所以这时就需要使用EventBus
这个类了。
在输入验证码的界面:
首先需要注册EventBus,在onCreateView方法或者在onCreate方法中都可以。注册方法:
EventBus.getDefault().register();
然后在,返回设置页面之前,调用:
EventBus.getDefault().post("CHANGE1","cn.ubeauty.change.user_info1");
最后在onDestroy()方法中注销EventBus。解除的方法:
EventBus.getDefault.unregister(this);
注意在设置页面的写法:
@Subscriber(mode = ThreadMode.MAIN,tag ="cn.ubeauty.change.user_info1")
private void userInfo1(String tag){
if(tag.equals("CHANGE1")){
if(getActivity() != null){
judeBound(); //重新获取Mobind的值
}
}
}
注释:
tag=" "; :这个里边的内容必须与post里边的参数一致。
方法名userInfo1:可以按照明明规范随意取值
CHANGE1 也必须与前边的对应,否则会出错
然后在该方法内部调用judeBound()方法重新获取需要获取的值ThreadMode 这是一个枚举类。定义了四种类型:postThread、MainThread、BackgroundThread、Async
PostThread 事件event的处理和发送都在相同线程中
MainThread 事件event的处理在主线程中,小心ANR
BackgroundThread 事件event的处理在后台线程(非线程)中,它是阻塞是的,如有多个事件发送过来,会一个一个处理
Async 事件event的处理是异步的,即新开一个线程进行处理。
对应的接收事件方法:
PostThread —– onEvent() 在发送事件的线程中接收事件
MainThread —– onEventMainThread() 在主线程中接收
BackgroundThread —- onEventBackgroundThread 在后台线程中接收
Async —– onEventAsync 在异步线程中接收
42 . dp、sp、px这几个长度单位的区别:
dp 也就是dip,这个和sp基本类似,如果设置表示长度、高度等属性时可以使用dp或sp.但设置字体,需要使用sp。
dp是与密度无关,sp除了与密度无关外。如果屏幕密度为160,这时dp和sp和px是一样的,1dp=1sp=1px. 但如果使用px作为单位,如果屏幕大小不变,而屏幕密度变成了320.那么原来TextView的宽度设为160排序,在密度为320的3.2寸,屏幕里看要比在密度为160的3.2寸屏幕上看断了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px。也就是160*320/160。其中320/160可称为密度比例因子。
如果使用dp和sp, 系统会根据屏幕密度的变化自动进行变换。
43.序列化与反序列化
对象序列化:把Java对象转换为字节序列并存储至一个存储媒介的过程。
对象的反序列化:把字节序列恢复为Java对象的过程。
Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取制定Java对象,在现有Java对象的机制下都不可能完成。
与Java对象不同的是,如果对Java对象执行序列化操作,应为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。
Android中Serialiazable与Parcelable的区别:
两种都用于支持序列化,反序列化操作。 Serializable使用IO读写存储在硬盘上,在序列化的时候会产生大量的临时变量,从而引起频繁的GC。而Parceable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parceable.
实现方式:
1. Serializable的实现,只需要继承 implements Serializable即可,这只是给对象打了一个标记,习哦他能够会自动将其序列化。
2. Parcelable的实现,需要在类中添加一个静态成员变量CREATOR,这个变量需要继承Parcelable.Creator接口。
public class MyParcelable implements Parcelable {private int mData;public int describeContents() {return 0;}public void writeToParcel(Parcel out, int flags) {out.writeInt(mData);}public static final Parcelable.Creator<MyParcelable> CREATOR= new Parcelable.Creator<MyParcelable>() {public MyParcelable createFromParcel(Parcel in) {return new MyParcelable(in);}public MyParcelable[] newArray(int size) {return new MyParcelable[size];}};private MyParcelable(Parcel in) {mData = in.readInt();}}
44. 在android中,简述JNI的调用过程:
1. 安装和下载Cygwin,下载Android NDK
2. 在NDK项目中JNI接口的设计
3. 使用C/C++实现本地方法
4. JNI生成动态链接库.so 文件
5. 将动态链接库复制到java工程,在Java工程中调用,运行Java工程即可
45. onSaveInstanceState()的作用:
当你的程序中,某一个Activity A在运行时,主动或被动的运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种 情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不用与直接启动的是这回onCreate()里是带上了参数savedInstanceState; 而没有被回收的就直接执行onResume(),跳过onCreate()了。
46.如何退出Activity?如何安全的退出一调用多个Activity的Application?
finish(), System.exit()。都可以。
退出多个Activity?
1. 抛异常强制退出:该方法通过抛异常,使程序ForceClose. 有一个问题是,如果解决,使程序结束掉,而不弹出Force Close的窗口。
2. 记录打开的Activity。每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
3. 发送特定广播。 在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4. 在打开新的Activity时,使用staartActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
但是这几种方式都不是最完美的,最后的是定义一个Activity的基类,处理这些共同的问题。
46. Service的使用步骤?
1. 继承Service类。extends Service
2. 在AndroidManifest.xml文件中的节点里对服务进行配置
3. 启动服务,两种方式,Context.startService()和Context.bindService()。
两种的区别:startService() 与调用者没有关连,即使调用者退出了,服务仍然运行。 onStopService()
bindService()与调用者绑定在一起,调用者一旦退出了,服务也就终止了。unbindService()
47.注册广播的几种方式,这些方式的特点:
1. 继承BroadcastReceiver。实现onReceiver方法,广播接收器。终止广播 abortBroadcast();。可以设置广播接收器接收广播的类型。
2.注册广播,动态注册和静态注册:
动态注册:
生成广播: boardCast=new ABoardCast();
设置过滤器:IntentFilter intentFilter =new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
注册广播:BroadCastReceiverActivity.this.registerReceiver(boardCast,intentFilter);
静态注册,是需要在AndroidManifest中配置的:
区别: 1.第一种不是常驻型广播,也就是说广播会跟随程序的生命周期一致。
2. 第二种是常驻型的,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
48. 横竖屏切换时候activity的生命周期?
1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏是会执行一次,切竖屏时会执行两次。
2. 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横,竖屏是只会执行一次。
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个声明周期,只会执行onConfigurationChanged方法。
49. 内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
内存溢出通俗理解就是软件运行需要的内存,超出了他可用的最大内存。
内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。
内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。
50. getWindow().setFlags的用法:
//设置窗体全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置窗体始终点亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//设置窗体背景模糊
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
51. android中View的事件分发机制:需要中的那掌握的三个方法和一个优先级:
三个方法:
1. public boolean dispatchTouchEvent(MotionEvent ev); 用来事件的分发,至哟呵时间能够传递到当前View,那么此方法一定会被调用。返回值表示是否消耗当前事件。
2. public boolean onInterceptTouchEvent(MotionEvent ev); 在上述方法内部调用,用来判断是否拦截某个事件。如果当前View拦截了某个事件,那么在同一事件序列中,此方法不会在被调用(直接调用onTouchEvent方法),返回结果表示是否拦截当前事件。只有ViewGroup中有此方法,且默认返回false即ViewGroup默认不拦截任何事件。
3.public boolean onTouchEvent(MotionEvent event); 在dispathTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,那么在同一个事件序列中,当前View无法再次接收到事件。
什么是同一个事件序列:
ACTION \_DOWM , ACTION\_MOVE , ACTION\_UP , ACTION\_CANCLE等一系列完整的事件。
优先级: onTouchListener > onTouchEvent > onClick
结论:
1. 同一个事件序列是指从手指接触屏幕那一刻起,到手指离开屏幕那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以ACTION\_DOWN事件开始,中间含有数量不定的ACTION\_MOVE事件,最终以ACTION\_UP事件结束。
2.一个事件序列只能被一个View拦截且消耗,因为一旦一个View拦截了某事件,那么同一个时间序列的所有事件都会交给它处理。
3.某个View一旦决定拦截事件,妈么这一个事件序列都只能由它处理。
4. 某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent方法返回false),那么同一事件序列的其他方法都不会在交给它处理,并且事件将重新交给父控件去处理,即父控件的onTouchEvent方法被调用。
5. 如果View 不消耗ACTION_DOWN以外的其他事件,那么这个点击事件会消失,此时父控件的onTouchEvent方法并不会调用,并且当前View可以持续接收到后续事件,最终这些消失的点击事件会交给Activity处理。
6. ViewGroup默认不拦截任何事件。
7. View中没有onInterceptTouchEvent方法,一旦有点击事件传递给他,那么他的onTouchEvent方法就会被调用。
8. View的onTouchEvent默认都会消耗事件(即返回true),除非他是不可点击的(clickable和longClickable同时为false),View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable属性默认为false.
9. View的enable 属性不影响onTouchEvent的默认返回值。哪怕一个View是disable状态的,只要它的clickable或者longClickable属性有一个为true,那么他的onTouchEvent就返回true.
52.自定义View的实现
什么是View?
View占据了屏幕中的一块矩形区域,负责视图的绘制和事件分发。View是所有控件的基类。
View中的几个位置参数top 、 left、right、bottom
分别对应于View的原始左上角横坐标、左上角横坐标、右下角横坐标、右下角纵坐标
都是相对坐标,相对于View的直接父容器来说的
都可以通过相对应的get方法获取到(getLeft(), getRight() , getTop() , getBottom())
— x、y、translationX、translationY
android 3.0以后加入,x、y是view的左上角的坐标,translationX、translationY是View左上角相对于父容器的偏移量。都可以通过get方法,获取到对应的值。
获得View的高度和宽度:
View的宽度 = getWidth() = getRight() – getLeft()
View的高度 = getHeight()= getBottom() – getTop();
获得测量的宽度和高度:
getMeasureWidth() getMeasuredHeight()
53.在android studio中怎么查看SHA1值:
1.打开一个项目,在工作界面的下方又有个Termial选项
2. 找到自己的debug.keystore的文件路径。
3.输入命令keytool -v -list -keystore 加上debug.keystore的文件路径
4 按回车,输入密钥库口令,android 默认的是android. 回车即可查看
54. PopupWindow与AlertDialog的区别
最关键的区别就是AlertDialog不能制定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以。
PopupWindow的使用方法:
1. 加载PopupWidnow的布局文件
LayoutInflater inflater=LayoutInflater.from(this).inflate(R.layout.main2,null);
2. 调用popupWidow的构造函数
PopupWindow pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,false);
3.设置一些特殊的参数
pop.setBackgroundDrawable(new BitmapDrawable()); //设置以下此参数,点击外边可消失
pop.setOutsideTouchable(true);//设置点击窗口外边窗口消失
pop.setOFocusable(true); //设置此参数获得焦点,否则无法点击
4.显示PopWindow。
例如:点击按钮显示PopWindow,再次点击按钮,PopupWindow消失
btn.setOnClickListener(new OnClickListener(){public void onClick(View v){if(pop.isShowing()){pop.dismiss();}else{pop.showAsDropDowm();}}});
55. Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式。
public boolean onKeyDown(int KeyCode,KeyEvent event){if(keyCode == KeyEvent.KEYCODE_BACK){moveTaskToBack(false);return true;}return super.onKeyDown(keyCode,event); }
56. 如何设置布局中Button按钮写英文,默认为大写的问题。android:textAllCaps="false";
57.FragmentActivity:继承自Activity,用来解决android3.0之前没有fragment的api。 所以在使用的时候需要导入support包,同时继承fragmentActivity,这样在activity中就能嵌入fragment来实现想要的布局效果。2.在android3.0之后,你就可以直接继承activity,并且在其中嵌入使用fragment。3. 获取的Manager的方式也不同。3.0以下:getSupportFragmentManager() . 3.0以上:getFragmentManager();
ListActivity: 继承子Activity,默认绑定了一个ListView(列表视图),界面组件。好处:使用listActivity这个类后,如果整个屏幕上只需要显示一个列表。我们可以把setContentView一行猪是调。不用定义列表的xml说明文件。
注意:继承ListActivity,然后在使用listView的两点区别。ListView控件的文件名必须写成:android:id="@+id/android:list" 形式。 获取控件:ListView lv=getListView() 这两点不同。其他相同。
PreferenceActivity :用于设置页面。PreferenceActivitgy从API level1中就加入了。那么后续自anroid 3.0 后有了Fragment的概念。同时也带来了PreferenceFragment。
Preference.xml有专属的preference.xml来构建自己的页面。
<PreferenceScreen>
<PreferenceCategory android:title>
<ListPreference android:key="list_key"
android:defaultValues="list key…"
android:summary="list_summary"/>
<EditTextPreference android:key="edittedt_key"/>
</PreferenceCategory>
</PreferenceScreen>
注:每一个Preference中都包含一个key(android:key),他的功能相当于普通layout中的id.
title: 这一项的标题, 字体比较大,
summay:摘要,标题下面的文字,字体较小。
defaultValue:为设置summary之前的默认值。
58. Gradle支持从maven中央仓库,和JCenter上获取构件。这两者的区别?
答:maven中央仓库,它是Apache Maven、SBT和其他构建系统的默认仓库。
59.onSaveInstanceState()这个处理函数会在Activity的Active声明周期结束时触发,但尽在它不是显示结束,因此,他一般用于确保在单个用户会话中的Active生命周期间Activity状态的一致性。
注:有一点很重要的是,记住onSaveInstanceState仅在Activity变成非Active状态时调用,但不再调用finish来关闭它或用户按下Back按钮时调用。由于onSaveInstanceState()并不是每次销毁是都会调用,所以不要在其中保存那些需要永久化的数据。执行保存安歇数据的最好地方是:onPause()中。