Android基础(一)

1.android:clipToPadding属性的分析
clipToPadding属性定义了是否允许ViewGroup在padding中绘制,该值默认为true,即不允许.
 * 所以若我们给ListView设置了android:paddingTop="70dip" android:paddingBottom="70dip"
 * 那么我们可以看到ListView的头部以上和尾部以下都占有70大小的padding,在滑动ListView的过程
 * 中这个padding当然是存在的.在padding部分是看不到ListView的item的,本质上是在这两部分没有绘制
 * 我们的ListView
 * 假若我们此时为ListView设置属性android:clipToPadding="false",同样再滑动ListView此时可以
 * 发现在ListView的头部以上和尾部以下都占有70大小的padding部分依然可以显示我们的ListView的
 * item,本质上是在这两部分绘制了我们的ListView
 * 
 * 该属性很适合的应用场景:
 * 设置ListView的第一个(最后一个)Item距离屏幕TOP(BOTTOM)有一段距离的情况
2. android:scrollbarStyle属性的分析

insideInset、insideOverlay、outsideInset、outsideOverlay属性

3.CardView 属性

android.support.v7.widget.CardView
complie ‘com.android.support:cardview-v7:23.1.0’
CardView继承至FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。CardView是一个Layout,可以布局其他View。

CardView常用属性:
card_view:cardElevation 阴影的大小
card_view:cardMaxElevation 阴影最大高度
card_view:cardBackgroundColor 卡片的背景色
card_view:cardCornerRadius 卡片的圆角大小
card_view:contentPadding 卡片内容于边距的间隔
card_view:contentPaddingBottom
- card_view:contentPaddingTop
- card_view:contentPaddingLeft
- card_view:contentPaddingRight
- card_view:contentPaddingStart
- card_view:contentPaddingEnd
card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式
card_view:cardPreventConrerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠

4.Android5.0新增的两个XML属性elevation和translationZ 属性

android5.0 引入了Z轴的概念,于是就有着这种风格,也就是目前比较火的Material Design。

  1. android:elevation 设置该组件“浮”起来的高度,通过设置该属性可以让该组件呈现3D效果。
  2. android:translationZ 设置该组件在Z方向(垂直屏幕方向)上的位移。
    对应的Java方法:setElevation(float) setTranslationZ(float)
5. 设置text的外观 android:textAppearance ,Button 设置button的style

android:textAppearance=”@style/TextAppearance.AppCompat.Button”
style=”?android:borderlessButtonStyle” 没有边框的按钮
如“android:textAppearance=“?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,

?表示系统是否有这种外观,否则使用默认的外观。

可设置的值如下:

textAppearanceButton/

textAppearanceInverse/

textAppearanceLarge/

textAppearanceLargeInverse/

textAppearanceMedium/

textAppearanceSmallInverse/

textAppearanceMediumInverse/
textAppearanceSmall/

6.Android系统中设置TextView的行间距(非行高)android:lineSpacingExtra android:lineSpacingMultiplier

1、android:lineSpacingExtra
设置行间距,如”3dp”。
2、android:lineSpacingMultiplier
设置行间距的倍数,如”1.2″。

7..android 的系统架构(上-下)
1.Application (应用)
2.Application Framework(应用程序框架层) 系统自带的API  Activity、Package、ResouseManager 。。
3.Libraries(系统运行库c/c++库), Sqlite,OpenGL,webkit
4.Linux kernel(Linux内核)硬件驱动:音频,照相机,蓝牙,WiFi驱动等
8.Android studio的使用:

Android studio使用教程系列:http://segmentfault.com/a/1190000002411926#articleHeader1

Android studio使用教程快捷键使用:http://segmentfault.com/a/1190000002418983

Android studio使用教程Gradle使用:http://segmentfault.com/a/1190000002439306

Android studio模拟器 配置:http://www.tuicool.com/articles/6RJ3mqJ

9.引用第三方

第三方类库jar包

这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖。如下:
dependencies {
compile ‘com.android.support:support-v4:19.1.0’
compile files(‘libs/libammsdk.jar’)
compile files(‘libs/universal-image-loader-1.8.6-with-sources.jar’)
compile files(‘libs/YoumiSdk_v5.00_2015-01-08.jar’)
}
第三方so库

通常来说,我们调用第三方的so库是不需要额外工作的,只需将其放入指定目录,然后在java文件中load即可。
比如我引用之前《第一个NDK程序》中编译出的libFirstLib.so,将其放到app/src/main/jniLibs/armeabi/下,在源码中引用:
static {
System.loadLibrary(“FirstLib”);
}
第三方类库源码

import medule 进去之后再project setting 里面导入library即可,或者直接在build.gradle里面配置也行:

参考:http://www.open-open.com/lib/view/open1415793464648.html Android studio gradle配置

10.消除“Permission is only granted to system apps”错误

在AndroidManifest.xml中使用了如下的配置:

就会报错:Permission is only granted to system apps
原因如下:
此类权限仅授予系统级应用,可以修改下Link Error Checking项的安全级别;
In Eclipse: Window -> Preferences -> Android -> Lint Error Checking
在ID列表中,找到ID = ProtectedPermission,设置Serverity低于Error,比如Warning级别就好了。

11.android 强大的Intent(意图)

给Intent带上附加值Ertra:

Intent i = new Intent(CSM_listView.this,ImageViewer.class);
i.putExtra("icon",data.icon);
startActivity(i);

接收方可以接收查看附加数据:

int icon = getIntent().getIntExtra("icon",0);
也可以分两步,方便查询多个附加数据:
Bundle bundle = getIntent().getExtras();
boolean willContinue = bundle.getBoolean("continueGame",false);
int icon = bundle.getInt ("icon",0);

发Intent启动Activity并获取返回值

i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(Intent intent, int requestCode);
并定义对返回值的处理函数
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
      if(resultCode == RESULT_OK ){ //操作没错误
       Bundle extras = data.getExtras();
       bmp = (Bitmap)extras.get("data");//关键词是“data”
       viewPhoto.setImageBitmap(bmp);
     }
}
12.全屏加无状态栏:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                  WindowManager.LayoutParams.FLAG_FULLSCREEN);
13.灰色的小提示框 Toast

Toast toast = Toast.makeText(this,”不知阁下尊姓大名?”,Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);//设置显示的位置
toast.show();

14.Preference使用
 如果要查找Preference中的控件(如,CheckBoxPreference,EditTextPreference等)用以下方法:
PreferenceManager manager = getPreferenceManager();

CheckBoxPreference password = (EditTextPreference) manager.findPreference(“password”);

获取Preference中的值使用:

PreferenceManager.getDefaultSharedPreferences(context).getString(“user”,”“);
或者分两步,方便查询同一个Preference中的多个值
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean willMusic = sharedPreferences.getBoolean(“music”,true);
String username = sharedPreferences. getString(“user”,”“);

15.android软件盘的使用:

Android中软键盘的使用是非常多的,下面为软键盘常用的设置;
1、横屏时,点击输入框出现全键盘解决方案: 在EditText、searchview等控件中加
android:imeOptions=”flagNoExtractUi”

2、竖屏时,安卓会出现半屏。
case1:你的输入框处于中下的位置,这样的话,键盘可能挡住输入框。 解决方法:在manifest中对activity设置
android:windowSoftInputMode=”adjustResize”
这样activity的主窗口总会resize为键盘提供空间
case2:你的输入框处于偏上面,一般情况下这样就不会有什么问题,但是如果你的界面纵向方面使用的是layout_weight即比重来分布页面的话,
软件盘会压缩整个window,导致输入框部分被压缩。 解决方法:在manifest中对activity设置
android:windowSoftInputMode=”adjustPan”
这样键盘不会对压缩原窗口,只会遮盖下面一部分内容。这样输入框不会被压缩了。
3、刚进入一个activity,会focus 输入框,这时会主动弹出软键盘,如果不希望自动弹出,那么可先让其他的不重要的控件获取焦点,然后一个定时器
再让EditText获取焦点即可!

4、判断软键盘当前是否处于弹出状态
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

5、手动隐藏软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

6、手动弹出软键盘
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);

16.通用的xml和json解析

1.T通用xml数据解析
SAX解析器:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
DOM解析器:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

2.T通用json数据解析

详细请看:http://blog.csdn.net/lyx2007825/article/details/7900675

17.HTTPUrlConnection post请求
private static final int TIMEOUT_IN_MILLIONS = 10 * 1000; // 超时时间
public static String doPost(String url, Map<String,Object> params) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";

try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) realUrl
.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "utf-8");
conn.setUseCaches(false);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);

if (params != null && !params.toString().equals("")) {
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(params);
// flush输出流的缓冲
out.flush();
}
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;

//  JSONObject json = new JSONObject(result.toString());
// 
//   bool = json.getBoolean("bool");
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
18.android动画
android动画一种是帧动画(Frame Animation),一种是补间动画(Tween Animation)。帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样。补间动画可以实现View组件的移动、放大、缩小以及渐变等效果。
<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  

    <item  
        android:drawable="@drawable/app_loading0"  
        android:duration="150"/>  
    <item  
        android:drawable="@drawable/app_loading1"  
        android:duration="150"/>  

</animation-list>  

animation-list 是动画列表,中间放很多的item 也就是组成帧动画的图片,
android:drawable[drawable]//加载Drawable对象
android:duration[long]//每一帧动画的持续时间(单位ms)
android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

19.ListView的属性

android:cacheColorHint=”#00000000” //设置拖动背景色为透明

 android:dividerHeight="30px"         //listview item之间的高度

 android:divider="@drawable/ic_launcher"    //listview item之间的背景或者说是颜色

 android:fadingEdge="vertical"         //上边和下边有黑色的阴影      值为none的话就没有阴影

 android:scrollbars="horizontal|none"   //只有值为horizontal|vertical的时候,才会显示滚动条,并且会自动影藏和显示

 android:fastScrollEnabled="true"        //快速滚动效果,配置这个属性,在快速滚动的时候旁边会出现一个小方块的快速滚动效果,自动隐藏和显示,

 android:scrollbarStyle="outsideInset"  //四个值的含义如下

1>outsideInset :  该ScrollBar显示在视图(view)的边缘,增加了view的padding. 如果可能的话,该ScrollBar仅仅覆盖这个view的背景.

2>outsideOverlay :  该ScrollBar显示在视图(view)的边缘,不增加view的padding,该ScrollBar将被半透明覆盖

3>insideInset :该ScrollBar显示在padding区域里面,增加了控件的padding区域,该ScrollBar不会和视图的内容重叠.

android:fastScrollEnabled=”false”
25
4>insideOverlay : 该ScrollBar显示在内容区域里面,不会增加了控件的padding区域,该ScrollBar以半透明的样式覆盖在视图(view)的内容上.
首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false
android:stackFromBottom=”true”
第二是 transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。 android:transcriptMode=”alwaysScroll”
第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性android:background=”@drawable/bg”,不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。
如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线
android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider=”@drawable/@null” 就可以了
第五fadingEdge属性,上边和下边有黑色的阴影
android:fadingEdge=”none” 设置后没有阴影了~
第六scrollbars属性,作用是隐藏listView的滚动条,
android:scrollbars=”none”与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏
第七fadeScrollbars属性,android:fadeScrollbars=”true” 配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。

20.adb常用命令

adb install 软件位置,安装软件
adb uninstall 包名:卸载模拟器的软件
adb push 保存
adb pull
1、简介:
ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备。
常用命令:
1)显示系统中全部Android平台: list targets
2)显示系统中全部AVD(模拟器):android list avd
3)创建AVD(模拟器):android create avd –name 名称 –target 平台编号
4)启动模拟器:emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800)
5)删除AVD(模拟器):android delete avd –name 名称
6)创建SDCard:mksdcard 1024M ~/名称.img
7)AVD(模拟器)所在位置:
Linux(~/.android/avd)
Windows(C:\Documents and Settings\Administrator.android\avd)
8)启动DDMS:ddms
9)显示当前运行的全部模拟器:adb devices
10)对某一模拟器执行命令:adb -s 模拟器编号 命令
11)安装应用程序:adb install -r 应用程序.apk
12)获取模拟器中的文件:adb pull
13)向模拟器中写文件:adb push
14)进入模拟器的shell模式:adb shell
15)启动SDK,文档,实例下载管理器:adb android
16)缷载apk包:adb uninstall apk包的主包名
17)查看adb命令帮助信息:adb help
18)在命令行中查看LOG信息:adb logcat -s 标签名

21.Application的作用
    Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作

(一).传递数据:
假如有一个Activity A, 跳转到 Activity B ,并需要推荐一些数据,通常的作法是Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。但这样作有一个问题在 于,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果我们的两个Activity在同一个 进程当中为什么还要这么麻烦呢,只要把需要传递的对象的引用传递过去就可以了。
基本思路是这样的。在Application中创建一个HashMap

22.自定义xml属性

一、在res/values文件下定义一个attrs.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<declare-styleable name="ToolBar"> 
<attr name="buttonNum" format="integer"/> 
<attr name="itemBackground" format="reference|color"/> 
</declare-styleable> 
</resources>

二、在布局xml中如下使用该属性:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<cn.zzm.toolbar.ToolBar android:id="@+id/gridview_toolbar" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:background="@drawable/control_bar" 
android:gravity="center" 
toolbar:buttonNum="5" 
toolbar:itemBackground="@drawable/control_bar_item_bg"/> 
</RelativeLayout>

三、在自定义组件中,可以如下获得xml中定义的值:

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar); 
buttonNum = a.getInt(R.styleable.ToolBar_buttonNum, 5); 
itemBg = a.getResourceId(R.styleable.ToolBar_itemBackground, -1);
a.recycle();

就这么简单的三步,即可完成对自定义属性的使用。


首先来看看attrs.xml文件。
该文件是定义属性名和格式的地方,需要用

<declare-styleable name="ToolBar"></declare-styleable>

包围所有属性。其中name为该属性集的名字,主要用途是标识该属性集。那在什么地方会用到呢?主要是在第三步。看到没?在获取某属性标识时,用到”R.styleable.ToolBar_buttonNum”,很显然,他在每个属性前面都加了”ToolBar_”。
在来看看各种属性都有些什么类型吧:string , integer , dimension , reference , color , enum.
前面几种的声明方式都是一致的,例如:。
只有enum是不同的,用法举例:

<attr name="testEnum"> 
<enum name="fill_parent" value="-1"/> 
<enum name="wrap_content" value="-2"/> 
</attr>

如果该属性可同时传两种不同的属性,则可以用“|”分割开即可。
让我们再来看看布局xml中需要注意的事项。
首先得声明一下:xmlns:toolbar=http://schemas.android.com/apk/res/cn.zzm.toolbar
注意,“toolbar”可以换成其他的任何名字,后面的url地址必须最后一部分必须用上自定义组件的包名。自定义属性了,在属性名前加上“toolbar”即可。
最后来看看java代码中的注意事项。
在自定义组件的构造函数中,用
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
来获得对属性集的引用,然后就可以用“a”的各种方法来获取相应的属性值了。这里需要注意的是,如果使用的方法和获取值的类型不对的话,则会返回默认值。因此,如果一个属性是带两个及以上不用类型的属性,需要做多次判断,知道读取完毕后才能判断应该赋予何值。当然,在取完值的时候别忘了回收资源哦!

23.解决应用点击home退出程序的bug:

在activity的ocreate()方法添加super.onCreate(savedInstanceState);

            if(!this.isTaskRoot()) { //判断该Activity是不是任务空间的源Activity,“非”也就是说是被系统重新实例化出来
            //如果你就放在launcher Activity中话,这里可以直接return了
                        Intent mainIntent=getIntent(); 
            String action=mainIntent.getAction();
            if(mainIntent.hasCategory(Intent.CATEGORY_LAUNCHER) && action.equals(Intent.ACTION_MAIN)) {
                finish();
                return;//finish()之后该活动会继续执行后面的代码,你可以logCat验证,加return避免可能的exception
            }
        }
24.判断当前是平板还是手机:
public boolean isTable(Context context) {

return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
25.android style 和theme

Android上的Style分为了两个方面:
1.Theme是针对窗体级别的,改变窗体样式;
2.Style是针对窗体元素级别的,改变指定控件或者Layout的
@color/white
true
@drawable/back (更改返回按钮的图标比如ToolBar)
@style/Daily.DrawerArrowStyle
false
true
@drawable/back
@color/ab_background_light
@color/black

自定义Dialog的Style:

<style name="Loading_Dialog" parent="@android:style/Theme.Dialog">
<item name="android:backgroundDimAmount">0.6</item>  <!-- 灰度 -->   
<item name="android:windowBackground">@android:color/transparent</item>  <!-- 背景透明 -->                                                   
<item name="android:windowFrame">@null</item><!-- 没有边框 -->   
<item name="android:windowNoTitle">true</item><!-- 无标题 -->   
<item name="android:windowIsFloating">true</item><!-- 是否悬浮在activity上 -->   
<item name="android:windowIsTranslucent">true</item><!-- 半透明 -->   
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->   

<item name="android:windowContentOverlay">@null</item><!-- 对话框是否有遮盖 --><item name="android:windowAnimationStyle">@style/dialog_animation</item><!-- 弹出或者进入时的动画效果 --><item name="android:colorBackgroundCacheHint">@null</item><!-- 背景缓存颜色 -->
</style>
26.shape用于设定形状,可以在selector,layout等里面使用,有6个子标签
<!-- 圆角 --><corners
        android:radius="9dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp"
        android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"/><!-- 设置圆角半径 --><!-- 渐变 --><gradient
        android:startColor="@android:color/white"
        android:centerColor="@android:color/black"
        android:endColor="@android:color/black"
        android:useLevel="true"
        android:angle="45"
        android:type="radial"
        android:centerX="0"
        android:centerY="0"
        android:gradientRadius="90"/><!-- 间隔 --><padding
        android:left="2dp"
        android:top="2dp"
        android:right="2dp"
        android:bottom="2dp"/><!-- 各方向的间隔 --><!-- 大小 --><size
        android:width="50dp"
        android:height="50dp"/><!-- 宽度和高度 --><!-- 填充 --><solid
        android:color="@android:color/white"/><!-- 填充的颜色 --><!-- 描边 --><stroke
        android:width="2dp"
        android:color="@android:color/black"
        android:dashWidth="1dp"
        android:dashGap="2dp"/>
27.ImageView.scaleType的几个属性
  1. SetScaleType(ImageView.ScaleType.CENTER);
    按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示

  2. SetScaleType(ImageView.ScaleType.CENTER_CROP);
    按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)

  3. setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽

setScaleType(ImageView.ScaleType.FIT_CENTER);
把图片按比例扩大/缩小到View的宽度,居中显示

  1. FIT_START, FIT_END在图片缩放效果上与FIT_CENTER一样,只是显示的位置不同,FIT_START是置于顶部,FIT_CENTER居中,FIT_END置于底部。
    在此就不给出示例了。

  2. FIT_XY
    不按比例缩放图片,目标是把图片塞满整个View。

28.File 类读写文件 :

如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中
进行权限的配置:
[java] view plaincopy在CODE上查看代码片派生到我的代码片

[java] view plaincopy在CODE上查看代码片派生到我的代码片

在对SD卡进行读写的时候会用到的知识点:
Environment类的静态方法:
* getDataDirectory(); 获取android中的data目录;
* getExternalStorgeDirectory(); 获取到外部存储的目录一般指SD卡;
* getDownloadCacheDirectory(); 获取到下载的缓存目录;
* getExternalStorageState(); 获取外部设置的当前状态,sd卡

Android 中外部存储的状态情况如下,我们比较常用的应该是 MEDIA_MOUNTED(sd卡存在并且可以进行读写):
* MEDIA_MOUNTED sd卡中可以进行读写;
* MEDIA_MOUNTED_READ_ONLY sd卡 存在,只可以进行读的操作

Android 对于外部存储的状态判断:
* getRootDirectory(); 获取到 Android Root 路径;
* isExternalStorageEmulated(); 判断外部存储是否有效;
* isExternalStorageRemovable(); 判断外部存储是否可以移除;

29.drawable 不同文件夹

每种切图都需要下面表格中的展示的三种规格

像素密度系数Logo分辨率
hdpi1.572 * 72
xhdpi2.096 * 96
xxhdpi3.0144 * 144
30.socket中TCP的三次握手建立连接详解

我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:
客户端向服务器发送一个SYN J
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
客户端再想服务器发一个确认ACK K+1
只有就完了三次握手当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

31.socket中TCP的四次握手释放连接详解

上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,
过程如下:
1.某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
4.接收到这个FIN的源发送端TCP对它进行确认。

32.Android动画举例解析–XML


[html] view plaincopy

<pre name="code" class="html">    <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    <alpha  
    android:fromAlpha="0.1"  
    android:toAlpha="1.0"  
    android:duration="3000"  
    />  
    <!-- 透明度控制动画效果 alpha  
            浮点型值:  
                fromAlpha 属性为动画起始时透明度  
                toAlpha   属性为动画结束时透明度  
                说明:  
                    0.0表示完全透明  
                    1.0表示完全不透明  
                以上值取0.0-1.0之间的float数据类型的数字  

            长整型值:  
                duration  属性为动画持续时间  
                说明:       
                    时间以毫秒为单位  
    -->  
    </set>  


[html] view plaincopy

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
   <scale    
          android:interpolator=  
                     "@android:anim/accelerate_decelerate_interpolator"  
          android:fromXScale="0.0"  
          android:toXScale="1.4"  
          android:fromYScale="0.0"  
          android:toYScale="1.4"  
          android:pivotX="50%"  
          android:pivotY="50%"  
          android:fillAfter="false"  
          android:duration="700" />  
</set>  
<!-- 尺寸伸缩动画效果 scale  
       属性:interpolator 指定一个动画的插入器  
        在我试验过程中,使用android.res.anim中的资源时候发现  
        有三种动画插入器:  
            accelerate_decelerate_interpolator  加速-减速 动画插入器  
            accelerate_interpolator        加速-动画插入器  
            decelerate_interpolator        减速- 动画插入器  
        其他的属于特定的动画效果  
      浮点型值:  

            fromXScale 属性为动画起始时 X坐标上的伸缩尺寸     
            toXScale   属性为动画结束时 X坐标上的伸缩尺寸       

            fromYScale 属性为动画起始时Y坐标上的伸缩尺寸     
            toYScale   属性为动画结束时Y坐标上的伸缩尺寸     

            说明:  
                 以上四种属性值     

                    0.0表示收缩到没有  
                    1.0表示正常无伸缩       
                    值小于1.0表示收缩    
                    值大于1.0表示放大  

            pivotX     属性为动画相对于物件的X坐标的开始位置  
            pivotY     属性为动画相对于物件的Y坐标的开始位置  

            说明:  
                    以上两个属性值 从0%-100%中取值  
                    50%为物件的X或Y方向坐标上的中点位置  

        长整型值:  
            duration  属性为动画持续时间  
            说明:   时间以毫秒为单位  

        布尔型值:  
            fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用  
-->  

[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
<translate  
android:fromXDelta="30"  
android:toXDelta="-80"  
android:fromYDelta="30"  
android:toYDelta="300"  
android:duration="2000"  
/>  
<!-- translate 位置转移动画效果  
        整型值:  
            fromXDelta 属性为动画起始时 X坐标上的位置     
            toXDelta   属性为动画结束时 X坐标上的位置  
            fromYDelta 属性为动画起始时 Y坐标上的位置  
            toYDelta   属性为动画结束时 Y坐标上的位置  
            注意:  
                     没有指定fromXType toXType fromYType toYType 时候,  
                     默认是以自己为相对参照物              
        长整型值:  
            duration  属性为动画持续时间  
            说明:   时间以毫秒为单位  
-->  
</set>  


[html] view plaincopy

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
<rotate   
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromDegrees="0"   
        android:toDegrees="+350"           
        android:pivotX="50%"   
        android:pivotY="50%"       
        android:duration="3000" />    
<!-- rotate 旋转动画效果  
       属性:interpolator 指定一个动画的插入器  
             在我试验过程中,使用android.res.anim中的资源时候发现  
             有三种动画插入器:  
                accelerate_decelerate_interpolator   加速-减速 动画插入器  
                accelerate_interpolator               加速-动画插入器  
                decelerate_interpolator               减速- 动画插入器  
             其他的属于特定的动画效果  

       浮点数型值:  
            fromDegrees 属性为动画起始时物件的角度      
            toDegrees   属性为动画结束时物件旋转的角度 可以大于360度     


            说明:  
                     当角度为负数——表示逆时针旋转  
                     当角度为正数——表示顺时针旋转                
                     (负数from——to正数:顺时针旋转)     
                     (负数from——to负数:逆时针旋转)   
                     (正数from——to正数:顺时针旋转)   
                     (正数from——to负数:逆时针旋转)         

            pivotX     属性为动画相对于物件的X坐标的开始位置  
            pivotY     属性为动画相对于物件的Y坐标的开始位置  

            说明:        以上两个属性值 从0%-100%中取值  
                         50%为物件的X或Y方向坐标上的中点位置  

        长整型值:  
            duration  属性为动画持续时间  
            说明:       时间以毫秒为单位  
-->  
</set>  
XML中的动画效果
[html] view plaincopy
public static Animation loadAnimation (Context context, int id)  
//第一个参数Context为程序的上下文     
//第二个参数id为动画XML文件的引用  
//例子:  
myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);  
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件  

在Java代码中定义动画

[java] view plaincopy
//在代码中定义 动画实例对象  
private Animation myAnimation_Alpha;  
private Animation myAnimation_Scale;  
private Animation myAnimation_Translate;  
private Animation myAnimation_Rotate;  

    //根据各自的构造方法来初始化一个实例对象  
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);  

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,  
             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  

myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);  

myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,  
               Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);  
33.

What is Application
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。
总结:
1.Application是android系统的一个组件,唯一个Application类(单例模式)
2.Application的生命周期是整个程序的生命周期
3.Application的作用 数据传递 数据共享 数据缓存 等

34.android的优点和缺点:

1、开源,有强大的软件开发者支持
2、无缝结合的Google应用。
3、对网络友好,丰富的功能选择。对比苹果对Flash的完全抵制……
4、软件兼容性好。

缺点:1.存在安全和隐私问题 2.运营商仍然能够影响到Android手机 3、分依赖开发商缺少标准配置 4、首先开卖Android手机的不是最大运营商

35.intent的作用:

Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

36.什么事ANR,如何避免:

ANR的定义:
在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
避免: 如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。

37.assets什么含义?与res的区别:

*res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

*res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

38.请介绍下Android的数据存储方式

Android 提供了5种方式存储数据:
–使用SharedPreferences存储数据;
–文件存储数据;
–SQLite数据库存储数据;
–使用ContentProvider存储数据;
–网络存储数据;

39. 防止手机进入休眠状态

PowerManager.WakeLock wl;
wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK,”whatever”);
wl.acquire();//启动休眠锁
wl.release();//释放休眠锁

40.WebView调用JS方法

做混合应用的时候webview 添加JavascriptInterface 后 js掉用方法 出现undefined 调试了一下午终于找到原因:
在绑定的方法前一定要加
@JavascriptInterface
否则在某些手机(比如红米)的webview中会出现调用方法时undefined的情况

41.android 使背景平铺(repeat):

方法1: 系统api实现
复制代码代码如下:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
//bitmap = Bitmap.createBitmap(100, 20, Config.ARGB_8888);
BitmapDrawable drawable = new BitmapDrawable(bitmap);
drawable.setTileModeXY(TileMode.REPEAT , TileMode.REPEAT );
drawable.setDither(true);
view.setBackgroundDrawable(drawable);
方法2: XML实现
xml路径:res/drawable/bg.xml
复制代码代码如下:

42.传感器基础

传感器的种类:

  1. 动作传感器
    加速度传感器、重力传感器和陀螺仪(判断手机姿态)等
  2. 位置传感器
    方向传感器和磁力传感器
  3. 环境传感器
    温度传感器 、压力传感器和亮度传感器

使用传感器的方法:
1. 获取SensorManager对象
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
2. 执行SensorManager对象的getDefaultSensor()方法获取Sensor对象并且传入一个特定的参数
3. 获取Sensor对象的各种属性
4. 使用SensorManager 的对象注册传感器,sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate);
第三个参数是获取的频率: SENSOR_DELAY_NORMAL(200000微妙) SENSOR_DELAY_UI(60000微妙) SENSOR_DELAY_GAME(20000微妙) SENSOR_DELAY_FASTEST(0微秒) 使用原则:尽量使用比较低的传感器采样率。这样系统的消耗较少,同时可以省电

电子罗盘:
1. /* 取得SensorManager */
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

  1. /* 取得需要的Sensor,并注册SensorEventListener */
    mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_NORMAL);

  2. /实现监听器,并重写其中的方法/
    private final SensorEventListener mSensorEventListener = new SensorEventListener()
    {
    public void onAccuracyChanged(Sensor sensor, int accuracy) { }
    public void onSensorChanged(SensorEvent event) {
    /* 判断Sensor的种类 */
    if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
    /* 取得X值资料

    • x_data是水平值
    • 由于分成8个方向,所以每个方向为45°
    • */
      float x_data = event.values[SensorManager.DATA_X];
      //北方为337.5°至22.5°
      if ((x_data > 0 && x_data <= 22.5) || x_data > 337.5) {
      TextView01.setText(“北方” + String.valueOf(x_data)); }
      //东北方为22.5°至67.5°
      else if (x_data > 22.5 && x_data <= 67.5) {
      TextView01.setText(“东北方” + String.valueOf(x_data)); }
      //东方为67.5°至112.5°
      else if (x_data > 67.5 && x_data <= 112.5) {
      TextView01.setText(“东方” + String.valueOf(x_data)); }
      //东南方为112.5°至157.5°
      else if (x_data > 112.5 && x_data <= 157.5) {
      TextView01.setText(“东南方” + String.valueOf(x_data)); }
      //南方为157.5°至202.5°
      else if (x_data > 157.5 && x_data <= 202.5) {
      TextView01.setText(“南方” + String.valueOf(x_data)); }
      //西南方为202.5°至247.5°
      else if (x_data > 202.5 && x_data <= 247.5) {
      TextView01.setText(“西南方” + String.valueOf(x_data)); }
      //西方为247.5°至292.5°
      else if (x_data > 247.5 && x_data <= 292.5) {
      TextView01.setText(“西方” + String.valueOf(x_data)); }
      //西北方为292.5°至337.5°
      else if (x_data > 292.5 && x_data <= 337.5) {
      TextView01.setText(“西北方” + String.valueOf(x_data)); } } } };
43.launchMode基础

我们今天要讲的是Activity的四种launchMode。
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。
Activity一共有以下四种launchMode:
1.standard
2.singleTop
3.singleTask
4.singleInstance
我们可以在AndroidManifest.xml配置的android:launchMode属性为以上四种之一即可。
下面我们结合实例一一介绍这四种lanchMode:
1.standard
standard模式是默认的启动模式,不用为配置android:launchMode属性即可,当然也可以指定值为standard。

2.singleTop
我们在上面的基础上为指定属性android:launchMode=”singleTop”,系统就会按照singleTop启动模式处理跳转行为。

44.IntentServices 和Services

IntentServices
利用这个方法无需手动控制线程的执行顺序
如果是一个后台任务,交给Service去执行,因为Service中也不能执行耗时操作,所以还是需要开启子线程开执行,使用这个方法就可以忽略这个问题
当任务执行完毕后会自动关闭服务
从Activity中发送Intent之后就可以丢给后台去处理,就算当前的Activity被finish掉也不会影响任务的执行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 基础知识包括以下内容: 1. Android 是什么? Android 是一个开源的操作系统,主要用于移动设备,例如智能手机和平板电脑。它由 Google 公司开发并维护,基于 Linux 内核,并提供了丰富的应用程序框架。 2. Android 应用程序的结构 Android 应用程序由四个主要组件构成:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供程序(Content Provider)。这些组件可以协同工作来创建丰富的用户体验。 3. Android 应用程序的开发语言 Android 应用程序可以使用 Java、Kotlin 或 C++ 进行开发。Java 是最常用的开发语言,但 Kotlin 正在逐渐流行起来。 4. Android 开发工具 Android 开发工具包(Android SDK)是 Android 开发所需的一套工具和库。其中包括 Android Studio(集成开发环境)、Android 调试桥(ADB)、模拟器和设备驱动程序等。 5. Android 布局和用户界面 Android 使用 XML 文件来定义应用程序的布局和用户界面。开发者可以使用一系列的布局容器和视图控件来创建灵活的界面。 6. Android 数据存储 Android 提供了多种数据存储选项,包括 Shared Preferences(用于存储简单的键值对)、文件存储、SQLite 数据库和网络存储(如使用 Retrofit 进行网络请求)。 7. Android 权限管理 Android 应用程序需要获取用户权限才能访问特定功能或数据。开发者需要在应用程序清单文件中声明所需的权限,并在运行时进行权限请求和处理。 这些是 Android 基础知识的一些要点,希望对你有所帮助!如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值