android由三层架构
从下到上
Liunx kernel主要有一些驱动程序。
lbraries库,由C,C++开发。
application Framework。平时开发在这个基础上的。java代码编写的。
applicaton。我们开发的程序。
2005年Google收购了刚成立的Android公司。
2007看11月,34家公司成立手机联盟。
相继有公司发布Android手机。
Android和iPhone.即Google和Apple公司的竞争。
Android iphone
PC,MAC,Linux MAC
Linux MAC OS
Java Objective C
25$ 99$
Android四大天王。即重要组件。
Activity界面美观。(美女)
Intent在应用程序之间传输数据
Service服务(劳模)
Content Provider(提供数据)
开发工具:Android SDK,eclipse及插件ADT
1.出售程序2.自己的程序上加广告


Window下搭建Android环境
1.AndroidSDK的安装。类似javaSDK.如ADB命令。集合,IO类。
2.ADT的安装和配置。google发布的插件,方便开发
3.Android模拟器的配置。模拟手机。也可以开发和调试。

http:developer.android.com/index.html下载。使用翻强软件。
sdk有window,Mac OX,Linux三个版本的。
下载后第一次运行sdksetup.exe就会从google下载相应的包。
安装后platforms文件中有各种版本的sdk.
tools中有adb.exe等很多命令,所以加把tools路径加入到环境变量中的Path后。分号隔开。

ADT的安装,Eclipse插件。装1.6版。eclipse的3.4版或3.5版。
www.eclipse.org/网站下载eclipse的相应版本。32位的64位的都有。
官网上有ADT的链接。拷下到粘到。
eclipse----help-----install new software
打开,Work with:下粘贴到这里。
它找到后会显示Available Software.下载安装。
https://dl-ssl.google.com/android/eclipse.
装完后会有open Android SDK and AVD Manager图标。
windos----preference---Android----SDK Location:SDK的安装路径。
点后显示
VirtualDevices:虚拟机。
Installed Packages安装过的包
Availabel Package可用的包

创建模拟器AVD。
Name:2.1,随便起
Target:Android2.1 update1-api level7即版本
SDCard:SD卡。字义虚拟的SD卡的大小。256M就行一般。
Skin:默认分辨率Built-in:Default HVGA
其它的默认就行。Create AVD
好了模拟器配置好了。选择后点Start。运行了模拟器。启动慢。2.5以上CPU。2G内存。

创建一个Hello World应用程序。
1.创建一个Android应用程序的步骤
2.Android应用程序目录结构
3.AndroidManifest.xml文件的作用
4.Android相关资源文件的作用。

打开Eclipse开发工具
在package视图中New一个 Android Project.
Project name:helloworld.下一步选择SDK的版本。通常1.6版。后在其它版本下编译。
Build Target就是选择SDK版本。
Application name:helloworld程序名
Package name:mars.helloword包
Create Activity:相当于在应用程序中显示的一个界面。开发工具自动为我们创建一个Activity类。
Min SDK Version:兼容最低版本的SDK.写成4.
程序目录的作用:
src:放置我们编写的源文件
gen:是ADT这个插件帮我们生成的一个文件。叫R.java.自动生成的,千万不要修改。
Android1.6:android.jar我们引用的anroid提供的类都来自这个文件。
assets:目录,在其中可以放置任何文件。
res:目录。中放置的所有的文件都会在R.java中自动生成唯一的ID。有三种分辨率,为每张图片放置三个版本。
drawable-hdpi高分辨率drawable-ldpi低分辨率drawable-mdpi中分辨率
layout:里面放置的是布局文件。每一个Activity都会生成一个布局文件。控件Activity控件的位置大小属性。每个布局文

件会在r.java中生成id.
values:里面放置我们在应用程序中所需要用到的值。里面有strings.xml文件。打开后发现里面全是键值对。这些键值对也

会在r.java中生成id.
AndroidManifest.xml文件
主要作用是对应用程序做一个相应的配置。
package:包名
application:android:icon="@drawable/icon"//drawable文件下的变量。
activity:android:label="@string/app_name" android:name=".HelloActivity"类名>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</indent-filter>//园丁了这个就会首先启动这个Activity.
</activity>
<uses-sdk android:minsdkVersion="4"/>最小SDK。
运行:右建HelloWord工程。run---android application.
我们使用的1.6 sdk版本。又设置了1.6版本的虚拟机或模拟器。
运行后加锁了。点Memu解锁。点返回回到安卓手机的界面。打开就能看到应用程序。什么时候用高分辨率程序会自动匹配。
总结:src放我们的代码gen中的文件是自动生成的不要修改。会自动为res文件中的文件生成id.我们可以使用这些id.
assets文件中放置文件不会自成id使用的时候要写全路径才行。layout下面放的布置文件。控制activity文件中控件的位

置。

Activity初步
1.Activity的主要作用
2.创建一个Activity的方法
3.在AndroidManifest.xml文件当中注册应用Activity的方法
4.在Activity当中添加控件的方法。
Activity是一个非常重要的用户接口,用户和程序交互的接口。
按钮,文本,广告控件。实际上它是一个控件的容器。
新建Android Project
定义项目名
选择BuildTarget
Application name
package name
create activity勾上
最低的版本4.
创建Activity有几个要点:
1.一个Activity就是一个类,并且这个类要继承Activity类。安桌自带的
2.需要复写onCreate方法。当Activity第一次运行的时候就会调用onCreate方法。我们可以在里面写一个要调用的代码。
3.activity要在AndroidManifest.xml中进行配置。
4.本身没有内容,需要添加必要的控件。

在res文件中的layout中放置的布局文件中增加控件。
<LinearLayout线性布局。android:orientaton控制垂直还是水平。vertical 或horitianl
android:layout_width="fill_parent" anroid:layout_height="fill_parent"控制宽度和高度。填充父控件。
<TextView文本控件android:layout_width="fill_parent"填充父控件。android:layout_height="wrap_content"//根据内容调

整高度。android:text="@string/hello"//最好不要设死。去掉就行了。
<Button android:layout_width="fill_parent" android:layout_height="wrap_content"
/>
每一个Activity布局文件都会在R.java中的layout中生成一个id。我们在src中可以使用那个生成的id.
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);//根据ID匹配文件。
TextView myTextView =(TextView)findViewById(R.id.myTextVew);
Button myButton = (Button)findViwById(R.id.myButton);
myTextView.setText("我的第一个TextView");
myButton.setText("我的第一个Button"+"\n"+"test");
先在布局文件中给控件加上id
android:id="@+id/myView"
android:id="@+id/myButton"

总结:Activity的作用。用户和应用程序交互的接口。用户的操作都是通过Activity完成的。
Activity是一个控件的容器。
创建一个Activity需要哪些步骤。
1.创建一个类,继承自Anroid平台中的Activity类。
2.复写onCreate方法。这个方法在Activity第一次被运行的时候调用。
3.每一个Activity要在AndroidManifest.xml文件进行配置。
4.为Activity添加必要控件。在layout文件中生成布局文件,在布局文件中对整个应用程序及添加怎样的控件进行布局。
5.通过findViewById方法取得布局文件中的控件,并且可以对控件的样式和内容进行设置。前提是每个控件要在R.java中设置

id.

Activity和Indent
1.多个Activiy之间的关系
2.Intent的基本作用
3.在一个Activity当中启动另外一个Activity的方法
4.使用Intent在Activity之间传递数据的基本方法。
多个Activity之间的关系
Activity01和Activity02.
通过Activity(Intent intent).
Intent的基本信息
1.Component name,2.Action,3.Data,4Extras
首先指定Intent对象中的Componentname,指定启动哪一个控件。还可以启动别的。
2.启动了另外一个Activity,传递一个方法,进行什么动作。是由Action决定的。
官方API中指定好了一些Action的常量。如ACTION_CALL。一个Activity启动另外一个Activity,要求另一个Activity做什么。由

Action指定。Data是一个URI。传输的信息。Extras可以事先在Intent里面设置键值对。说明Indent中包含了这几项信息。

View是所有控件的父类。
根据Intent中的Component name决定启动哪一个Activity。
Action有很多的常量Action_call。初始化电话,指定另外一个Activity要做什么。
Data中的URI指定类型。传送的数据。
Extras是一些键值对。事先向Intent对象中存一些键值对.另一个被启动的Activity在OnCreate时可能通过getIntent()来得到发起方传过来的
Intent对象实例。并可以从中通过键取出里面的值。
发起方Activity调用另一个Activity时。需要在发起方中定义一个内部类并实现事件监听的接口方法。在实现的事件方法中通过Intent实例的putExtra(key,value)的方式传值;
通过Intent实例的setClass(发起Activity类的this,被发起Activity类的.class);来指定发起类和被发起类。通过发起类的.this.startActivity(intent);
来启动intent中设定的Activity.
在onCreate方法中,要先调用父类的onCreate方法。通过findViewById(id)找到相应的控件。调用控件的方法修改属性或者设定控件的监听事件。
public void onCreate(Bundle,savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView myView = (TextView)findViewText(R.id.myView);
Button myButton = (Button)findViewById(R.id.myButton);
myView.setText("");
myButton.setText("");
myButton.setOnClickListener(new MyButtonListener());
}
class MyButtonListener implements onClickListener{
public void onClick(View arg0){
Intent intent = new Intent();
intent.putExtra("textView","123");
intent.putExtra("button","456");
intent.setClass(MainActivity.this,SubActivity.class);
MainActivity.this.startActivity(intent);
}
}

接收方Activity的onCreate在创建时执行下发代码并取得发起方Activity送到Intent中的参数。
intent通过getIntent()取得发起方Activity传过来的Intent的实例。
intent.getStringExtra("textView");根据键取得intent中值。
这两个Activity组件可以不在同一个应用程序中,也可以在同一个应用程序中。例如发短信的例子。
Uri uri=Uri.parse("smsto://0800000123");
Intent intent = new Intent(Intent.ACTION_SENDTO,uri);
intent.putExtra("sms_body", "The SMS text");
startActivity(intent);
要在AndroidManifest.xml中进行注册每一个Activity.


主要内容
TextView主要是用来在Activity当中显示一个文本的信息
EditText可以编辑的文本框
Button按钮
Menu菜单控件。
计算的例子
Activity03和ResultActivity
Activity03
1.在Activity03当中要声明四个控件,两个EditText,一个Button,一个ViewText
必须在main.xml中进行声明
<LinearLayout xmlns:android=""
android:orientation="vertical"
>
<EditText
android:id="@+id/factorOne"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextText
android:id="@+id/symbol"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>

<EditText
android:id="@+id:factorTwo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

<Button
android:id="@+id:calculate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
在Activity03中把四个控件都取出来。通过findViewById.
为symbol和calculate设置显示的值
symbol.setText("乘以");//简单但写的太死了。可能会有语言版本的问题
calculate.setText("计算");//可以在strings.xml中设置字符串。
可以在strings.xml中设置字符串。比如symbol和calculate
symbol.setText(R.string.symbol);
calculate.setText(R.string.calculate);
calculate.setOnClickListener(new CalculateListener());
编写一个监听器。内部类。
class CalculateListener implements OnClickListener{
实现onClick方法
按钮按下时会触发这个事件。
取得两个EditText控件的值
将这两个值存放到Intent对象当中
使用这个Intent对象来启动ResultActivity
String factorOneStr = factorOne.getText().toString();
String factorTwoStr = factorTwo.getText().toString();
Intent intent = new Intent();
intent.putExtra("one",factorOneStr);
intent.putExtra("two",factorTwoStr);
intent.setClass(Activity03.this,ResultActivity.class);
Activity03.this.startActivity(intent);
}
2.要为其中的两个控件设置显示的值。
3.创建一个监听器类,监听按钮按下的动作
4.将监听器类的对象绑定在按钮对象上
Observer设计模式的理解有利于理解Listerner。

在ResultActivity中处理
1.接受从Activity03当中所传递的值
2.计算两个值的积
3.将计算的结果显示在TextView中。
先声明TextView控件的对象,resultView
resultView = (TextView)findViewById(R.id.result);
//得到Intent对象当中的值
Intent intent = getIntent();
String factorOneStr = intent.getStringExtra("one");
String factorTwoStr = intent.getStringExtra("two");
int factorOneInt = Integer.parseInt(factorOneStr);
int factorTwoInt = Integer.parseInt(factorTwoStr);
int result = factorOneInt*factorTwoInt;
resultView.setText(result+"");//技巧:一个有字符串另一个也会自动转为字符串。


添加一个退出的菜单
需要重写一个函数
当客户点击MENU按钮的时候调用该方法
onCreateOptionMenu(Menu menu){
menu.add(0,菜单所处的主的id.0,当前菜单的id.1,排序1,R.string.exit菜单内容);
menu.add(0,2,2,R.string.about);
reutrn super.onCreateOptionsMenu(menu);
在这个方法中menu.add就会增加一个菜单项。
}
当客户点击子菜单或者叫菜单中的某一个选项的时候响应该方法。并把你点的参数传进来。你可以根据点击不同的选项做不同的操作。
现在点了没有反应,因为还没有加事件,所以要重载onOptionsItemSelected(MenuItem item){
根据客户点击执行相应的动作,判断的是第二个参数itemId
if(item.getItemId()==1){
finish();//结束操作
}
return super.onOptionsItemSelected(item);
}
上面两个菜单函数都是回调函数

Activity的生命周期
Activity的七个生命周期函数
onCreate,
onStart
onRestart
onResume
onPause
onStop
onDestroy
例如FirstActivity
启动一个新的Activity就会依次的调用三个方法onCreate,onStart,onResume.
onCreate方法。当第一次被创建的时候就会调用这个方法。主要做了设置Activity所使用的布局文件,绑定的监听器。
onStart方法。当这个Activity可以被用户看到的时候会调用onStart方法。
onResume方法。当Activity可以获得用户焦点的时候就会获得onResume方法。
onPause方法。当启动另外一个Activity的时候就会调用onPause方法。再运行第二个Activity的前三个方法,再执行FirstActivity的onStop方法
在onPause方法主要写保存当前Activity的信息。
第二个Activity前三个方法调用后调用第一个的onStop方法。因为第一个不可见了所以调onstop方法。
比如在第二个中显示的是一个对话框,并没有把第一个完全遮挡起来,就不会调用onStop方法。
当点击back之后,第二个调用自己的onPause方法。第一个并没有被销毁,所以它调用onResart方法。onStart,onResume方法。
再调用第二个的onStop方法。因为第一个把第二个完全遮挡起来了。

Task的基本概念:就是一个栈中有许多的activities.
三个Activity.
第一个中有一个按钮,点击后会启动第二个,第二个中也有一个按钮,点击启动第三个。第三个中有发送短消息的代码。
用户体验到四个界面是一个程序。用户体验比较好。
其实他们四个组成了一个Task。
启动后第一个压入栈中,
当点击第一个的按钮时第二个压入栈中。第一个处在了底部。
当点击第二个的按钮时就会启动第三个,第三个对象被压入栈中。
当点击第三个的发送短消息时,就会调用发短息的Activity。
当点击back的时候,发送短消息的Activity就被弹出来了。第三个变成了当前的。再点back,依次。
Task的作用把不同的应用程序的Activites组织在一起。帮我们更清楚理解生命周期。
假如第二个调了finish();再从第三个返回第二个时,就直接回到了第一个。

对话框窗口风格的Activity。
和普通的没有什么大的区别。只是在AndroidManifest.xml中指定了窗口风格的Activity的android:theme="@android:style/Theme.Dialog"/>

Activity的布局
LinearLayout线性布局
TableLayout表格布局
Activity中的onCreate中设置布局文件。
layout.xml管理应用程序的布局。让控件的显示方式和控件的事件动作隔离开。
<LinearLayout>
xmlns:XML的命名空间
android:orientation="vertical"//方向。选择从帮助文档。eclipse的代码提示功能。alt+/,ADT开发工具为我们提供的方便的

功能。水平方向即横着放,竖起方向或垂直方向控件竖着排。
android:layout_width="fill_parent"//填满父控件。
有子标签,中间的都是
<TextView>//文本控件
android:id="@+id/firstText"//标识符,编程时通过此取到对象
android:text=""//显示的内容
android:gravity="top",right,center_vertical垂直方向居中,相对它自己的位置来说的。控件文本的位置
android:textSize="35pt"//字体的大小
android:background="#aa0000"//背景色
android:layout_width="fill_parent"//填满父
android:layout_height="wrap_content"//自动调
android:paddingLeft="10dip"//左边距,内容和边框的距离叫边距。dip对不同分辨率的屏幕会更好一些。
android:paddingTop="20dip"//上边距
android:paddingRight="30dip"//右边距
android:paddingBottom="40dip"//底边距
android:layout_weight="1"//占整个布局的比例
android:singleLine="true"//把所有内容显示在一行中
</TextView>
<!---->注释
android:id//为控件指定相应的ID
android:text//指定控件当中的显示的文字,需要注意,这里尽量使用strings.xxx
android:grivity//指定控件的基本位置,比如说居中,居右等
android:textSize//指定控件当中字体的大小
android:background//指定该控件所使用的背景色,RGB命名法
android:width//指定控件的宽度
android:height//指定控件的高度
android:padding//指定控件的内边距,也就是说控件当中的内容
android:singleLine//如果设置为真的话,则将控件的内容在同一行当中进行显示
</LinearLayout>//根标签
LinearLayout可以嵌套
<TableLayout>//表格布局,几个TableRow几行,TableRow里几人控件就显示几列。
android:layout_width="fill_parent"//填满父控件。
android:layout_height="fill_parent"//填满父控件。
android:stretchColumns="1"// 哪一列是否拉伸,指定拉伸列
<TableRow>
<TextView>
android:padding="3dip"//四边的边距
</TextView>
</TableRow>
<TableRow>
<TextView>
android:padding="3dip"//四边的边距
</TextView>
</TableRow>
</TableLayout>
Layout嵌套。可以多个LinearLayout或TableLayout。相当于Panel
相对布局:创建更加复杂的控件的关系。
android:layout_above//将控件的底部置于给定Id的控件之上
android:layout_below//将控件的顶部置于给定ID的控件之下
android:layout_toLeftOf将该控件的右边缘和给定ID的左边缘对齐
android:layout_toRightOf将该控件的左边缘和给定ID的控件的右边缘对齐

android:layout_alignBaseline控件的baseline与给定ID控件的baseline对齐
android:layout_alignBottom控件的底部边缘与给定ID控件的底部边缘对齐
android:layout_alignLeft控件的左边缘与给定ID控件的左边缘对齐
android:layout_alignRight控件的右边缘与给定ID控件的右边缘对齐
android:layout_alignTop控件的顶部边缘与给定ID控件的顶部对齐
android:layout_alignParentBottom控件的底部和父控件的底部对齐
android:layout_alignParentLeft控件的左边与父控件的左边对齐
android:layout_alignParentRight控件的右边与父控件的右边对齐
android:layout_alignParentTop控件的顶部与父控件的顶部对齐
android:layout_centerHorizontal置于水平方向的中央
android:layout_centerParent如果值为真,置于父控件水平和垂直方向的中央
android:layout_centerVertical 如果值为真,该控件将被置于垂直方向的中央

相对布局:控制控件相对的位置来控制控件的位置。

常用控件二
RadioGroup和RadioButton
CheckBox
Toast基本用法
控件的布局文件也不是必须的。可以有动态的布局。
<RadioGroup>
<RadioButton
android:text="@string/female"
/>
<RadioButton/>
</RadioGroup>
代码部分使用:
把RadioGroup和RadioButton声明一下。
通过控件的ID来得到代表控件的对象
为控件绑定监听器,不是给RadioButton设置监听器,而给RadioGroup设置。
实现onCheckedChanged(RadioGroup group,int checked){
根据checked指定选中的按钮
}
checkbox没有组的概念,没有监听器。
tostot用来提示
Toast.makeText(RadioTest.this,"famle",Toast.LENGTH_SHORT);

ProgressBar
进度条
ListView
列表的形式显示出来
ProgressBar
Activity.xml中
<ProgressBar
主进度,第二进度
android:visibility="gone"
android:max="200"
/>
声明变量
两个进度条表示总的下载进度和各个文件的下载进度。
private ProgressBar firstBar=null;
firstBar=(ProgressBar)findViewById(R.id.firstBar);
private ProgressBar secondaryBar=null;
secondaryBar=(ProgressBar)findViewById(R.id.secondaryBar);
在onClick方法中
if(i==0)
{
firstBar.setVisibility(View.VISIBLE);
secondBar.setVisibility(View.VISIBLE);
firstBar.setMax(150);
}else if(i<firstBar.getMax())
{
//设置进度条的当前值
firstBar.setProgress(i);
//设置进度条的当前值
firstBar.setSecondaryProgress(i+10);//默认100
//因为默认的进度条是无法显示进行的状态
//secondaryBar.setProgress(i);
}
else{
firstBar.setVisibility(View.GONE);
sencondaryBar.setVisibility(View.GONE);
}
i+=10;
}

ListView.选中一条,整行选中。
实现的是ListActivity,Activity的子类。
ArrayList<HashMap<String,String>>list = new ArrayList<HashMap<Stirng,String>>();
HashMap<String,String> map1 = new HashMap<String,String>();
HashMap<String,String> map2 = new HashMap<String,String>();
HashMap<String,String> map3 = new HashMap<String,String>();
map1.put("user_name","zhangsan");
map1.put("user_ip","192.16.0.1");
map2.put("user_name","lisi");
map2.put("user_ip","192.16.0.2");
map3.put("user_name","wangwu");
map3.put("user_ip","192.16.0.3");
list.add(map1);
list.add(map2);
list.add(map3);
SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.user,new String[]{"user_name","user_ip"},new int[]{R.id.user_name,R.id.user_ip});
setListAdapter(listAdapter);
setListAdapter(listAdapter);


还需要一个user.xml进行配置。
点击listview时触发onListItemClick(ListView l,View v,int position,long id){
根据position和id判断执行哪一个。
}

把下载文件放到一个线程里去处理。下载不影响当前的使用。

手机操作过程中不能所有的功能都写在Activity的事件里。否则影响用户体验,比如下载大量数据。
Activity是一个线程
下载文件或处理数据又是一个线程。
这样会有很好的用户体验。Handler就是处理多个线程同时处理事情的。
HandlerActivity extends Activity
根据控件的ID得到代表的对象,设定监听器。
onClick(View v){
handler.post(updateThread);}//马上把这个线程加到消息队列中。
Handler handler = new Handler();
Runnable updateThread = new Runable();
Java中实现线程有两种。继承Thread,实现Runable接口。
每个Button实现自己的监听器并在监听器实现OnClick中实现自己的占击代码。
线程进入运行状态的时候运行run()方法里的代码。
handler.postDelayed(updateThread,3000);
隔3000毫秒把这个线程加到消息队列中一次。

EndButtonListener的onClick中
handler.removeCallbacks(updateThread);//从消息队列中移除线程
先创建一个Handler对象
把要调用的代码封装到一个线程里。
如果想要一直循环执行,就可以把handler.postDelayed(updateThread,3000),写到线程里。
这就是异步的消息处理。
匿名内部类复写Handler当中handleMessage(Message msg);方法。
Handler updateBarHandler = new Handler(){
public void handleMessage(Message msg){
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);//立即执行这个线程。
}

}

Message msg= updateBarHandler.obtainMessage();//得到一个消息对象,Message类是有Android操作系统提供。
msg.arg1 = i;//设置msg即消息参数的方法。还有arg2,用arg1,arg2这两个成员变量传递消息,优点是系统能源消耗较少。
Tread.sleep(1000);//当前线程睡眠1秒。这个语句写在线程的run方法里。
updateBarHandler.sendMessage(msg);将msg对象加入到消息队列当中。在消息队列中并不会立即执行。要排队的。
updateBarHandler从消息队列中取出消息用handleMessage方法处理消息。

Handler为我们提供了一种异步的消息处理机制。


Handler与线程的关系。
Handler与使用Handler的Activity是同一个线程的关系,我们创建一个新的线程后,要先start一个线程。
Thread.currentThread().getId();当前线程的ID
Thread.currentThread().getName();打印当前线程的Name
Bundle的用法


Bundle:是一个以String为键,其它数据类型为值的Mapping。
有大量的get方法。有大量的put方法。
可以看作它是一个特殊的Map。区别在于它的键是固定的String类型的。而值也有固定的几个类型。而Map的键和值都是Object类型的。
它就是一个数据存储工具。
有大量的功能最好用两个线程来处理,不要和Activity同一个线程。像下载文件特别大,可能会造成Activity这个线程卡死。
那使用Looper来启动另外一个线程。它循环的从队列当中取出消息,来处理消息。
我们要想实现Looper的功能用HandlerThread这个类就行了,它已经实现了使用Looper来处理消息队列的功能。这个类由Android应用程序框架提供。
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());//自己实现的内部类
Message msg = myHandler.obtainMessage();
msg.sendToTarget();
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
public void handleMessage(Message msg){

}
}

Handler类构造函数接收Looper对象作为参数,意味着当前的Handler就使用这个Looper所在的线程去处理消息队列。
把这个Handler绑定在另外一个线程上来从消息队列当中来开始往外处理数据。所以Myhandler处理消息就在另外一个线程中了。
每当我们向Hander发送一个Message对象的时候就会执行发的handleMessage这个方法。
MyHandler myHandler = new MyHandler(handlerThread.getLooper());//从这里来的Looper对象。HandlerThread来的。
Message msg = myHandler.obtainMessage();//获取消息对象。
msg.sendToTarget();//发送消息到目标对象。哪一个对象生成的Message,它就会把这个消息发给哪个Hander对象.就会调用这个Handler的handleMessage这个方法。
这就是如何在新线程中来处理消息的方法。Message里还有一个Obj的参数。它接收一个Object类型的对象。可以是Stirng。
如果要传递大量数据的话,可以使用Message的另外一个方法,Message.setData(Bundle data);.
我们可以先生成一个Bundle,然后放进去。
Bundle b= new Bundle();
b.putInt("age",20);
b.putString("name","John");
msg.setData(b);
msg.sendToTarget();就会发送到Handler对象中。如果这个Message是Handler生成的。然后就会调用Handler的handleMessage()方法。
可以在Handler的handleMessage()中取数据。
Bundle b= msg.getData();
int age = b.getInt("age");
String name=b.getString("name");

handler.post(线程)的时候并没有生成新线程。而是和Activity共用一个线程。
在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法。否则Looper就是空的。就是NULL。
下面我们生成自己的Handler的时候呢把生成的Looper传进去。自己的Handler一定要加接收looper的构造函数。才能通过构造函数传进去。
学习完这个Hanler接收Looper以后,我们就可以在自己的程序中处理耗时比较长,比较复杂的操作了。


屏幕适配知识

ip device independent pixels设备独立像素。不同设备不同的显示效果,和设备硬件有关。
android程序将会在不同分辨率的手机上运行。为了让程序外观相差不大引入dip。
换算公式:pixs=dips*(density/160)。10dips*(160dpi/160)=10pixs.10像素。把160dpi的屏换成240dpi的屏上,
10dip*(240dpi/160)=15pix.15像素。
这里要告别注意dip与屏幕密度有关,而屏幕密度又与具体硬件有关,硬件设置不正确,有可能导致dip不能正常显示。
在屏幕密度为160dpi的显示屏上,1dip=1px.
dip=(int)(px/1.5+0.5)
dp:同dip一样,一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px.
px:pixels(像素) 屏幕上的点,不同设备不同的显示屏效果相同,这是绝对像素,是多少就永远是多少。
一般我们用HVGA代表320*480像素。
sp scaled pixels.best for text size(放大像素)与刻度无关的像素。主要处理字体的大小,与dp类似,但是字体可以根据用户
的字体大小首选进行缩放。主要用于字体显示最好的大小。查看testview的源码可知,安卓默认使用sp作为字号单位。
google推荐像素统一使用dip,字体统一使用sp.
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议始终用sp作为字体大小的单位,将dip作为其他元素的单位,也可考虑使用矢量图,
而不是用位图。
其它单位:pt磅。point,是一个标准的长度单位,1pt=1/72英寸,印刷业比较普遍。
in inches(英寸):长度单位
mm millimeters(毫米):长度单位

HVGA屏 density=160
QVGA屏 density=120
WVGA屏 density=240
WGA屏 density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。
android:anyDensity="true",系统会依据屏幕密度,自动去找对应的文件夹。
android:anyDensity="false",有中间先找中间的。drawable-mdpi.
drawable-hdpi该图片适用于横屏,也适用于竖屏。
drawable-land-hdpi当屏幕为横屏,且为高密度时,加此资源。
drawable-port-hdpi当屏幕为竖屏,且为高密度时,加此资源。

android:width是定义控件上面文本宽度,

今天实现两个Activity的跳转时intent中传递一个ArrayList的类型,结果报parcel unable to marshal value的错误,代码跟踪也没有找到原因。

后来得知不能传递List类型,如果传递ArrayList类型,要对ArrayList中的类实现序列化,即implemennts Serializable或继承Parcel。在另一个Activity接收时也要使用序列化相关方法进行接收。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. 【 Android(安卓)10 系统启动 】系列 -- ShutdownThread(关机流程
  5. Android(安卓)8.1 中Systemui中的常见修改(六)NavigationBar加载流
  6. Android中如何像 360 一样优雅的杀死后台服务而不启动
  7. 系出名门 Android(安卓)系列文章索引
  8. android videoview的使用
  9. 2018-07-26 常见UI控件

随机推荐

  1. Android(安卓)使用SQLiteDatabase操作SQL
  2. android多线程handler+runOnUithread+vie
  3. Android的应用组件
  4. Android(安卓)EditText限制输入两位小数
  5. Android开发网上的一些重要知识点_2
  6. Android(安卓)Notification 基础
  7. android点击事件穿透
  8. Android(安卓)aidl Binder框架浅析
  9. android 笔记 --- 相机应用
  10. aFinal框架