Android琐碎知识点,不断更新中

﹏ヽ暗。殇╰゛Y 2022-08-20 07:18 613阅读 0赞

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);

  1. canvas.concat()的作用可以理解成对matrix的变换应用到canvas上的所有对象

6.JSON数据中,集中符号的表示意思:

{}:大括号表示对象

  1. \[ \] 中括号表示数组

“ ” :双引号内是属性或值

  1. :: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
  2. 例如:{“name : "Michael"}可以理解为是一个包含nameMichael的对象
  3. \[{“name”: "Michael"}, \{"name" : "sanshi"\}\] 就表示包含两个对象的数组
  4. 第二句也可以使用以下的代码表示:
  5. {“name : \["sanshi" , "Jerry"\]}来简化上面一部,这是一个拥有一个name数组的对象
  1. JSON解析的三种方式

    第一. 传统的JSON解析 可以把json字符串解析为一个javabean,一个List数组,一个嵌套Map的List数组

    第二. GSON解析 Gson.fromJson(jsonString , cls);

    第三. FastJson解析 JSON.parseObject(jsonString, cls);

  2. EditText中常见但是不常用的属性

    android:textCursorDrawable=”@null” 这个属性是用来控制光标的颜色

    “@null” 作用是让光标颜色和text color颜色一样

    android:cursorVisible=”false” 隐藏edittext闪烁的光标

    android:paddingLeft=“10dp” 需要在EditText输入的时候左起位置和自动换行后每行的左起位置都能空出10dp

9.ListView各个条目之间如何留有一定的空隙

  1. android:dividerHeight="10dp" 各个条目之间上下的间隔为10dp
  1. 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设置文字的外观

    1. “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,
    2. ?表示系统是否有这种外观,否则使用默认的外观。
    3. 可设置的值如下:
    4. textAppearanceButton/
    5. textAppearanceInverse/
    6. textAppearanceLarge/
    7. textAppearanceLargeInverse/
    8. textAppearanceMedium
  1. android:textScaleX 设置文字之间间隔,默认为1.0f
  2. android:textStyle 设置字形\[bold 粗体 0 italic 斜体 1bolditalic(又粗又斜) 2\] 可以设置一个或多个,用" | " 隔开

11.RatingBar的使用

  1. RatingBar是基于SeekBarProgressBar的扩展,用星型来显示等级评定,使用RaingBar的默认大小时,用户可以触摸/拖动或使用键来设置评分,它有两种样式,一种是ratingBarStyleSmall,大风格用于ratingBarStyleIndicator。其中大的只适合指示,不适合于用户交互。
  2. 几个重要的属性:
  3. android:isIndicator RatingBar是否是一个指示器,
  4. android:numStars 显示星型数量,必须是一个整形值,像“100
  5. android:rating 默认的评分,必须是浮点类型,像“1.2
  6. android:stepSize 评分的步长,必须是浮点类型,像“1.2

12.FragmentActivity 与Activity的区别

  1. 1.FragementActivity继承自Activity,用来解决Android3.0之前无法使用Fragment的问题,所以在使用的时候需要导入android-support-v4.jar兼容包,同时继承FragmentActivity,这样在Activity中就能嵌入Fragment来实现你想要的布局效果
  2. 2. 当然Android3.0之后你就可以直接继承自Activity,并且在其中嵌入使用Fragment
  3. 3. 获得FragmentManager的方式也不同
  4. android 3.0 以下 getSupportFragmentManager();
  5. android 3.0以上: getFragmentManager();
  1. onLayout(boolean changed, int l, int t, int r , int b)各个参数的作用:

    1. 参数changed表示view有新的尺寸或位置
    2. 参数 l 表示相对于父viewTop位置
    3. 参数 r 表示相对于父vieright位置
    4. 参数 b 表示相对于父viewBottom位置

14.为什么自定义View中onLayout方法被执行两次是怎么回事

  1. 如果父视图的子视图的个数为0,就会执行一次。否则就会执行多次。因为开始时父视图中是没有子视图的。但是当你从xml文件中加载子视图或者或者在Java代码中添加子视图时,父视图的状态会发生变化,这个变化会引起onLayout甚至onMeasure.

15.Application中的两个获取Context方法的区别getApplication() 和 getApplicationContext()

  1. getApplication() getApplicationContext() 这两个获取Application实例的方法,在Activityservice中是没有没有任何区别的,但是getApplicationContext()的作用范围比getApplication()的作用范围更广,例如在BroadcastReceiver中也想获得Application实例,就不能使用getApplication(), 就只能使用getApplicationContext()方法了。意思就是说,getApplicationContext的作用范围更广,任何一个Context,都可以使用getApplicationContext()方法拿到我们的Application对象。
  1. ListView加载网络图片的问题

    每当有新的图片进入界面时,就会回调getView()方法,而在getView()方法中会开启异步请求从网络上获取图片,注意网络操作都是比较耗时的,也就是说当我们快速滑动ListView的时候就很有可能出现这样一种情况,某一个位置上的元素进入屏幕后开始从网络上请求图片,但是还没等图票下载完成,他就又被移出了屏幕。这种情况下会产生什么样的现象呢? 根据ListView的工作原理,被移出屏幕的控件将会很快被新进入屏幕的元素重新利用起来,而如果在这个时候刚好前面发起的图片请求有了响应,就会将刚才位置上的图片显示到当前位置上,因为虽然他们位置不同,但都是共用的同一个ImageView实例,这样就出现了图片乱序的情况。但是还没有完结,新进入屏幕的元素他也会发起一条网络请求来获取当前位置的图片,等到图片下载完的时候会设置到同样的ImageView 上面,因此就会出现先显示一张图片,然后有变成另外一张图片的情况。

  2. 请使用命令行的方式创建一个名字为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(必须)

  1. -c : sdcard指向一个共享的SD存储卡的路径或是为新的AVD定制新的SD卡的容量大小
  2. -p : pathAVD将被创建的位置路径
  3. -n : nameAVD的名称
  4. -f : force强制创建(覆盖已存在的AVD
  5. -s : skin AVD的皮肤
  1. 手机屏幕关于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设备。

  1. Android中的IPC机制(进程间的通信)

    IPC是内部进程通信的简称,是共享“命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Service端实现IPC接口,Client端调用IPC接口本地代理。

  2. NDK是什么?

    NDK是一系列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和Java应用打包成apk包。

    NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so.

  3. afinal 支持断点续传。

    afinal是一个开源的android的orm和ioc应用开发框架,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm,无需任何配置信息,一行代码就可以对android的splite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。

    主要组件,FinalHttp : 用于请求http数据,直接ajax方式请求,文件上传,断点续传下载文件等

    1. FinalBitmap: 用于显示bitmap图片,而无需考虑线程并发和oom等问题
    2. FinalActivity : 完全可以通过注解方式绑定控件和事件,无需编写代码
    3. FinalDb androidsqliteorm框架,一行代码搞定增删改查
  4. 获取应用程序中的最大可用内存

    int maxMemory = (int)Runtime.getRuntime().maxMemory();

  5. Bitmap 与Drawable的区别

  1. Bitmap :称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565RGB888.作为一种主限速的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。
  2. Drawable : 作为Android下通用的图形对象,它可以装载常用格式的图像,比如GIFPNGJPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变,图形等。
  3. 详解:A bitmap is a drawable . A Drawable is not necessarily a bitmap ,Like all thumbs are fingers but not all fingers are thumbs;
  4. Drawable在内存占用和绘制速度这两个非常关键的点上胜过Bitmap
  5. 怎么把bitmap转换成Drawable?
  6. BitmapDrawable drawable = new BitmapDrawable(getContext().getResources(), bitmap);

24.设置ListView每个条目之间的间隔

  1. android:divider="@color/background";
  2. android:dividerHeight="10dp"

25.在使用svn进行提交代码的时候,注意备注的日志信息不能够为空,如果为空的话在会提示提交不成功,还得重新提交。切记。

  1. 在使用Gson解析json字符串的时候,怎么建立JavaBean 是非常关键的。要注意一下三点,

第一. 内部嵌套的类必须是static的,要不然解析会出错。

第二. 类里面的属性名必须跟json字段里面的key是一模一样的。

第三. 内部嵌套的用[], 括起来的部分是一个List, 所以定义为public List b. 而只用{}嵌套的就定义为public C c;

请看如下代码:

json字符串 :

String json = {
“a”:”100”,
“b”:[{“b1”:”b_value1”,”b2”:”b_value2”},
{“b1”:”b_value1”,”b2”:”b_value2”}],

  1. "c": \{"c1":"c\_value1","c2":"c\_value2"\}
  2. \}

相对应的Bean类为:

public class JsonBean{

  1. public String a;
  2. public List<B> b;
  3. public C c;
  4. public static class B\{
  5. public String b1;
  6. public String b2;
  7. \}
  8. public static class C\{
  9. public String c1;
  10. public String c2;

}

}

  1. 在程序代码中如何获取手机的信息

    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(); //运营商

  2. 一般情况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);

  1. “application/vnd.android.package-archive” 是文件类型,具体对应apk类型

  2. EditText获取焦点的方法,下面的三个属性必须同时设置:

    private TextView password=null;

    password.setFocusable(true);

    password.setFocusableInTouchMode(true);

    password.requestFocus();

  3. TextView使用了ellipase这个属性,怎么判断文字是否超过的文本框的界限,出现了神略号:

  1. Layout layout=((TextView) findViewById(R.id.doctor_details_be_good)).getLayout();
  2. if(layout != null){
  3. int lines=layout.getLineCount();
  4. if(lines >0){
  5. if(layout.getEllipsisCount(lines-1)>0){
  6. ToastUtils.showLongToast(DoctorDetailsActivity.this,"出现了省略号");
  7. }else{
  8. ToastUtils.showLongToast(DoctorDetailsActivity.this,"没有出现省略号"); } }}
  1. android中界面上要显示价格,怎么保留两位小数:

    1. DecimalFormat df=new DecimalFormat("0.00");
    2. df.format(价格);

35.怎么在不要使用的文字中间加上下划线:

  1. textView.getPaint().setFlags(Paint.STRIKE\_THRU\_TEXT\_FLAG | Paint.ANTI\_ALIAS\_FLAG);
  1. 在实际开发中LayoutInflater这个类是非常有用的,他的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化。而findViewById()是找xml布局文件下的具体widget控件。具体的作用:

1.对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.infalte()来载入;

2.对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。

获得LayoutInflater实例的三种方式:

1.LayoutInflater inflater=getLayoutInflater(); //调用Activity的getLayoutInflater()方法

  1. LayoutInflater inflater=LayoutInflater.from(context);

  2. 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 之间的相互转换

  1. Bitmap转换为Drawable
  2. Drawable drawable= new BitmapDrawable(bmp);
  3. Drawable 转换为Bitmap
  4. Resources res=getResources();
  5. Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.sample\_0);
  1. 显示电话号码,以这样的形式显示133****1266

    以133****1266的形式显示电话号码

    //以153****0000的形式显示电话号码
    public String showTelPhone(String mobile) {

    1. String str = "";
    2. for (int i = 0; i < mobile.length(); i++) \{
    3. if (i == mobile.length() - 11) \{
    4. str += mobile.charAt(i);
    5. \} else if (i == mobile.length() - 10) \{
    6. str += mobile.charAt(i);
    7. \} else if (i == mobile.length() - 9) \{
    8. str += mobile.charAt(i);
    9. \} else if (i == mobile.length() - 4) \{
    10. str += mobile.charAt(i);
    11. \} else if (i == mobile.length() - 3) \{
    12. str += mobile.charAt(i);
    13. \} else if (i == mobile.length() - 2) \{
    14. str += mobile.charAt(i);
    15. \} else if (i == mobile.length() - 1) \{
    16. str += mobile.charAt(i);
    17. \} else \{
    18. str += "\*";
    19. \}
    20. \}
    21. return str;

    }

  1. 在页面上显示,显示一段文字,以不同颜色显示:

    1. String explain="<font color=\\"gray\\">如需换绑手机号,请确保您已安装</font>" +
    2. "<font color=\\"red\\">UTOUU客户端</font>" +
    3. "<font color=\\"gray\\">,并在UTOUU客户端中购买</font>" +
    4. "<font color=\\"red\\">\\"马良神笔\\"</font>" +
    5. "<font color=\\"gray\\">道具进行手机号的换绑</font>" ;
    6. tv\_unBoundExplain.setText(Html.fromHtml(explain));
  2. 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

  1. PostThread 事件event的处理和发送都在相同线程中
  2. MainThread 事件event的处理在主线程中,小心ANR
  3. BackgroundThread 事件event的处理在后台线程(非线程)中,它是阻塞是的,如有多个事件发送过来,会一个一个处理
  4. Async 事件event的处理是异步的,即新开一个线程进行处理。

对应的接收事件方法:

  1. PostThread ----- onEvent() 在发送事件的线程中接收事件
  2. MainThread ----- onEventMainThread() 在主线程中接收
  3. BackgroundThread ---- onEventBackgroundThread 在后台线程中接收
  4. Async ----- onEventAsync 在异步线程中接收

42 . dp、sp、px这几个长度单位的区别:

  1. dp 也就是dip,这个和sp基本类似,如果设置表示长度、高度等属性时可以使用dpsp.但设置字体,需要使用sp
  2. dp是与密度无关,sp除了与密度无关外。如果屏幕密度为160,这时dpsppx是一样的,1dp=1sp=1px. 但如果使用px作为单位,如果屏幕大小不变,而屏幕密度变成了320.那么原来TextView的宽度设为160排序,在密度为3203.2寸,屏幕里看要比在密度为1603.2寸屏幕上看断了一半。但如果设置成160dp160sp的话。系统会自动将width属性值设置成320px。也就是160\*320/160。其中320/160可称为密度比例因子。
  3. 如果使用dpsp, 系统会根据屏幕密度的变化自动进行变换。

43.序列化与反序列化

  1. 对象序列化:把Java对象转换为字节序列并存储至一个存储媒介的过程。
  2. 对象的反序列化:把字节序列恢复为Java对象的过程。
  3. Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取制定Java对象,在现有Java对象的机制下都不可能完成。
  4. Java对象不同的是,如果对Java对象执行序列化操作,应为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。
  5. AndroidSerialiazableParcelable的区别:
  6. 两种都用于支持序列化,反序列化操作。 Serializable使用IO读写存储在硬盘上,在序列化的时候会产生大量的临时变量,从而引起频繁的GC。而Parceable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parceable.

实现方式:

  1. Serializable的实现,只需要继承 implements Serializable即可,这只是给对象打了一个标记,习哦他能够会自动将其序列化。

    1. Parcelable的实现,需要在类中添加一个静态成员变量CREATOR,这个变量需要继承Parcelable.Creator接口。
  1. public class MyParcelable implements Parcelable {
  2. private int mData;
  3. public int describeContents() {
  4. return 0;
  5. }
  6. public void writeToParcel(Parcel out, int flags) {
  7. out.writeInt(mData);
  8. }
  9. public static final Parcelable.Creator<MyParcelable> CREATOR
  10. = new Parcelable.Creator<MyParcelable>() {
  11. public MyParcelable createFromParcel(Parcel in) {
  12. return new MyParcelable(in);
  13. }
  14. public MyParcelable[] newArray(int size) {
  15. return new MyParcelable[size];
  16. }
  17. };
  18. private MyParcelable(Parcel in) {
  19. mData = in.readInt();
  20. }
  21. }
  1. 在android中,简述JNI的调用过程:

    1. 安装和下载Cygwin,下载Android NDK

    2. 在NDK项目中JNI接口的设计

    3. 使用C/C++实现本地方法

    4. JNI生成动态链接库.so 文件

    5. 将动态链接库复制到java工程,在Java工程中调用,运行Java工程即可

  2. onSaveInstanceState()的作用:

    当你的程序中,某一个Activity A在运行时,主动或被动的运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种 情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不用与直接启动的是这回onCreate()里是带上了参数savedInstanceState; 而没有被回收的就直接执行onResume(),跳过onCreate()了。

46.如何退出Activity?如何安全的退出一调用多个Activity的Application?

  1. finish(), System.exit()。都可以。
  2. 退出多个Activity
  3. 1. 抛异常强制退出:该方法通过抛异常,使程序ForceClose. 有一个问题是,如果解决,使程序结束掉,而不弹出Force Close的窗口。
  4. 2. 记录打开的Activity。每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
  5. 3. 发送特定广播。 在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
  6. 4. 在打开新的Activity时,使用staartActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
  7. 但是这几种方式都不是最完美的,最后的是定义一个Activity的基类,处理这些共同的问题。
  1. Service的使用步骤?

    1. 继承Service类。extends Service

      1. 在AndroidManifest.xml文件中的节点里对服务进行配置

      2. 启动服务,两种方式,Context.startService()和Context.bindService()。

        两种的区别:startService() 与调用者没有关连,即使调用者退出了,服务仍然运行。 onStopService()

        1. bindService()与调用者绑定在一起,调用者一旦退出了,服务也就终止了。unbindService()

47.注册广播的几种方式,这些方式的特点:

  1. 1. 继承BroadcastReceiver。实现onReceiver方法,广播接收器。终止广播 abortBroadcast();。可以设置广播接收器接收广播的类型。
  2. 2.注册广播,动态注册和静态注册:
  3. 动态注册:
  4. 生成广播: boardCast=new ABoardCast();
  5. 设置过滤器:IntentFilter intentFilter =new IntentFilter("android.provider.Telephony.SMS\_RECEIVED");
  6. 注册广播:BroadCastReceiverActivity.this.registerReceiver(boardCast,intentFilter);
  7. 静态注册,是需要在AndroidManifest中配置的:

区别: 1.第一种不是常驻型广播,也就是说广播会跟随程序的生命周期一致。

  1. 2. 第二种是常驻型的,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
  1. 横竖屏切换时候activity的生命周期?

    1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏是会执行一次,切竖屏时会执行两次。

    2. 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横,竖屏是只会执行一次。

      3.设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个声明周期,只会执行onConfigurationChanged方法。

  2. 内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?

    内存溢出通俗理解就是软件运行需要的内存,超出了他可用的最大内存。

    内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。

    内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。

  3. 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);

  1. android中View的事件分发机制:需要中的那掌握的三个方法和一个优先级:

    三个方法:

    1. 1. public boolean dispatchTouchEvent(MotionEvent ev); 用来事件的分发,至哟呵时间能够传递到当前View,那么此方法一定会被调用。返回值表示是否消耗当前事件。
    2. 2. public boolean onInterceptTouchEvent(MotionEvent ev); 在上述方法内部调用,用来判断是否拦截某个事件。如果当前View拦截了某个事件,那么在同一事件序列中,此方法不会在被调用(直接调用onTouchEvent方法),返回结果表示是否拦截当前事件。只有ViewGroup中有此方法,且默认返回falseViewGroup默认不拦截任何事件。
    3. 3.public boolean onTouchEvent(MotionEvent event); dispathTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,那么在同一个事件序列中,当前View无法再次接收到事件。

什么是同一个事件序列:

  1. ACTION \\\_DOWM , ACTION\\\_MOVE , ACTION\\\_UP , ACTION\\\_CANCLE等一系列完整的事件。

优先级: onTouchListener > onTouchEvent > onClick

结论:

  1. 同一个事件序列是指从手指接触屏幕那一刻起,到手指离开屏幕那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以ACTION\_DOWN事件开始,中间含有数量不定的ACTION\_MOVE事件,最终以ACTION\_UP事件结束。

2.一个事件序列只能被一个View拦截且消耗,因为一旦一个View拦截了某事件,那么同一个时间序列的所有事件都会交给它处理。

3.某个View一旦决定拦截事件,妈么这一个事件序列都只能由它处理。

  1. 某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent方法返回false),那么同一事件序列的其他方法都不会在交给它处理,并且事件将重新交给父控件去处理,即父控件的onTouchEvent方法被调用。

  2. 如果View 不消耗ACTION_DOWN以外的其他事件,那么这个点击事件会消失,此时父控件的onTouchEvent方法并不会调用,并且当前View可以持续接收到后续事件,最终这些消失的点击事件会交给Activity处理。

  3. ViewGroup默认不拦截任何事件。

  4. View中没有onInterceptTouchEvent方法,一旦有点击事件传递给他,那么他的onTouchEvent方法就会被调用。

  5. View的onTouchEvent默认都会消耗事件(即返回true),除非他是不可点击的(clickable和longClickable同时为false),View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable属性默认为false.

  6. View的enable 属性不影响onTouchEvent的默认返回值。哪怕一个View是disable状态的,只要它的clickable或者longClickable属性有一个为true,那么他的onTouchEvent就返回true.

52.自定义View的实现

  1. 什么是View?
  2. View占据了屏幕中的一块矩形区域,负责视图的绘制和事件分发。View是所有控件的基类。
  3. View中的几个位置参数top leftrightbottom
  4. 分别对应于View的原始左上角横坐标、左上角横坐标、右下角横坐标、右下角纵坐标
  5. 都是相对坐标,相对于View的直接父容器来说的
  6. 都可以通过相对应的get方法获取到(getLeft(), getRight() , getTop() , getBottom())

-— x、y、translationX、translationY

  1. android 3.0以后加入,xyview的左上角的坐标,translationXtranslationYView左上角相对于父容器的偏移量。都可以通过get方法,获取到对应的值。
  2. 获得View的高度和宽度:
  3. View的宽度 = getWidth() = getRight() - getLeft()
  4. View的高度 = getHeight()= getBottom() - getTop();

获得测量的宽度和高度:

getMeasureWidth() getMeasuredHeight()

53.在android studio中怎么查看SHA1值:

  1. 1.打开一个项目,在工作界面的下方又有个Termial选项
  2. 2. 找到自己的debug.keystore的文件路径。
  3. 3.输入命令keytool -v -list -keystore 加上debug.keystore的文件路径
  4. 4 按回车,输入密钥库口令,android 默认的是android. 回车即可查看
  1. PopupWindow与AlertDialog的区别

    最关键的区别就是AlertDialog不能制定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以。

    PopupWindow的使用方法:

    1. 1. 加载PopupWidnow的布局文件
    2. LayoutInflater inflater=LayoutInflater.from(this).inflate(R.layout.main2,null);
    3. 2. 调用popupWidow的构造函数
    4. PopupWindow pop = new PopupWindow(view, LayoutParams.WRAP\_CONTENT,LayoutParams.WRAP\_CONTENT,false);
    5. 3.设置一些特殊的参数
    6. pop.setBackgroundDrawable(new BitmapDrawable()); //设置以下此参数,点击外边可消失
    7. pop.setOutsideTouchable(true);//设置点击窗口外边窗口消失
    8. pop.setOFocusable(true); //设置此参数获得焦点,否则无法点击
    9. 4.显示PopWindow
    10. 例如:点击按钮显示PopWindow,再次点击按钮,PopupWindow消失
  1. btn.setOnClickListener(new OnClickListener(){
  2. public void onClick(View v){
  3. if(pop.isShowing()){
  4. pop.dismiss();
  5. }else{
  6. pop.showAsDropDowm();
  7. }
  8. }
  9. });
  1. Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式。
  1. public boolean onKeyDown(int KeyCode,KeyEvent event){
  2. if(keyCode == KeyEvent.KEYCODE_BACK){
  3. moveTaskToBack(false);
  4. return true;
  5. }
  6. return super.onKeyDown(keyCode,event);
  7. }
  1. 如何设置布局中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来构建自己的页面。











注:每一个Preference中都包含一个key(android:key),他的功能相当于普通layout中的id.

title: 这一项的标题, 字体比较大,

summay:摘要,标题下面的文字,字体较小。

defaultValue:为设置summary之前的默认值。

  1. Gradle支持从maven中央仓库,和JCenter上获取构件。这两者的区别?

    1. 答:maven中央仓库,它是Apache MavenSBT和其他构建系统的默认仓库。

59.onSaveInstanceState()这个处理函数会在Activity的Active声明周期结束时触发,但尽在它不是显示结束,因此,他一般用于确保在单个用户会话中的Active生命周期间Activity状态的一致性。

注:有一点很重要的是,记住onSaveInstanceState仅在Activity变成非Active状态时调用,但不再调用finish来关闭它或用户按下Back按钮时调用。由于onSaveInstanceState()并不是每次销毁是都会调用,所以不要在其中保存那些需要永久化的数据。执行保存安歇数据的最好地方是:onPause()中。

发表评论

表情:
评论列表 (有 0 条评论,613人围观)

还没有评论,来说两句吧...

相关阅读