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

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()中。

        

Published by

风君子

独自遨游何稽首 揭天掀地慰生平