Android学习笔记
1.一个Android Project的文件作用
用eclipse生成一个Android Project,配置好后,生成了很多文件
src文件夹中是自己编写的源文件
gen文件夹下的R.java是ADT自动生成的文件,主要内容是res文件下各元素的id值
res中存放了各种资源文件,其中三个文件夹drawable-hdpi drawable-mdpi drawable-ldpi是对应不同分辨率的图片,layout文件夹下的main.xml关于布局,values文件夹中strings.xml是关于字符
AndroidManifest.xml中是控制应用的包名,图标,首先的Activity等信息
2.创建一个Activity
一个Activity是一个类,并且要继承自一个Activity类
需要复写onCreate方法
每一个Activity组件都需要在AndroidManifest.xml中进行配置
为Activity添加控件
3.为一个Activity设置一些简单元素
首先,每个Activity需要在AndroidManifest中进行配置,是否是开始时就执行这个Activity等
然后,打开res->layout->main.xml中,中间父类标签是<LinearLayout>是线性布局的意思,还有绝对位置布局,相对位置布局等
在其中添加一个Button
<Button
android:id="@+id/MyButton" 为Button添加id,由于R.Java中没有id这个类,需要加个‘+’符号
android:layout_width="fill_parent" 宽度填满父类
android:layout_height="wrap_content" 高度与内容相符合
/>
这个时候run已经可以看到新添加的Button了
之后,打开Activity_01.java文件,在onCreate方法中来为控件添加属性
通过id获得控件 findViewById()方法 通过id找到元素返回一个View类
Buttonmybutton=findViewById(R.id.MyButton);
mybutton.setText("第一个Button");
其中关键的方法:findViewById(R.id.button1)
4.设置多个Activity,用Intent来传值,启动
首先,创建一个Activity
在AndroidManifest.xml中添加Activity(已经自动生成好)
在layout->main.xml中添加一个button,加上id
在类重写的onCreate方法中获得button控件并且设置button的属性
然后,再创建一个Activity
在原来的src下面的包里新建一个class,继承Activity类,复写onCreate方法(在类中右键选Source->Override/Implement选onCreate)
在AndroidManifest.xml中添加Activity{
其中要添加android:name=".otherActivity" (前面有一个' . ',加上包名刚好找到)
android:label="@string/other" (在string.xml中设置了<stringname="other">hahaha</string>)
}
在layout中添加一个other.xml文件,添加布局,新增一个button,在onCreate方法中setContentView(R.layout.other);
继续,创造联系两个Activity的Intent
在与OnCreate方法平行的地方写一个类
class MyButtonListener implements OnClickListener{ //此处引入包时要注意!!!点击OnClickListener变灰引入包,选view那个
public void onClick(View v){
Intent intent=new Intent(); //创建Intent对象
intent.putExtra("Tags","Bussiness"); //intent可以传递参数 用intent.putExtra(键值,值)的方式
intent.setClass(Activity02.this,otherActivity.class); //从自身类(Activity02.this),传到哪个类(otherActivity.class)
Activity.this.startActivity(intent);
}
}
再之后把这个类绑定到button上
在OnCreate方法中再写
mybutton.setOnClickListener(newMyButtonListener());
在otherActivity类名中进行获得传递的参数值
Intent intent=getIntent(); //先获得Intent对象
String value=intent.getStringExtra("Tags"); //把传过来的值获得
调用viewtext的setText方法进行设置显示
其中关键的方法:intent.putExtra("Tags","hahaha");
intent.setClass(当前的Activity类.class,目标的Activity类.class)
startActivity(intent);
String got=EditView控件.getText().ToString();
button名.setOnClickListener()
intent=getIntent();
String parameter=intent.getStringExtra("one");
5.EditText控件
用控件对象.getText()获得输入框里的内容,然后还要加.ToString()
setText(里面必须是String类型) 如果是int 后面加个""
6.菜单Menu
要在Activity类中重写onCreateOptionsMenu(Menumenu)方法
然后用menu.add(0,1,1,string)来添加MENU选项
要编写每个选项实现的功能要重写onOptionsItemSelected(MenuItemitem)方法
其中关键方法:menu.add(intgroupId,int ItemId,int order,string description)
int id= item.getItemId(); //返回点击的Item的id值
7.弹出对话框
在Manifest.xml中添加Activity的时候多加一个android:theme="@android:style/Theme.Dialog"
8.RadioGroup RadioButton控件
添加RadioGroup控件时有一个属性android:orientation="vertival" "horizontal"
为RadioGroup添加一个setOnCheckedChangeListener
rg.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if(male.getId()==checkedId){
System.out.println("click male");
}
else if(female.getId()==checkedId){
System.out.println("click female");
}
}
});
关键方法:
radioButton1.getId()
9.CheckBox控件
swim.setOnCheckedChangeListener(newRadioGroup.OnCheckedListener()
{
public voidOnCheckedChange(RadioGroup group,int checkedId){
if(swim.getId()==checkedId){
}
}
}
);
10.Toast控件--提示框
Toast.makeText(Activity类名.this,"输出的内容",Toast.LENGTH_SHORT); //最后一个参数是显示多少毫秒
11.ProgressBar进度条
添加进度条到main.xml布局文件时,加一个
style="?android:attr/progressBarStyleHorizontal" 会得到一个水平进度条
style="?android:attr/progressBarStyle" 得到一个菊花条
android:visibility="gone" 隐藏
android:max="200" 最大200
关键方法:
first.setVisibility(View.VISIBLE)
first.setProgress(20);
first.setSecondaryProgress(30);
12.ListView控件
工程继承自ListActivity
在布局中添加一个ListView控件 android:id="@id/android:list" //有专属的id
每个ListActivity必须要调用setListAdapter(adapter)方法,因此需要一个adapter作参数
SimpleAdapter adapter=new SimpleAdapter( //SimpleAdapter是一个适配器类
this, //运行的环境,也就是当前工程类
list, //一个存储数据的数组 ArratList<HashMap<String,???>>
R.layout.user, //用来显示的layout
new String[]{"user_name","user_id"}, //上面数组中的键部分
new int[]{R.id.user_name,R.id.user_id} //要显示到的控件id
);
所以参数里的元素是下面部分:
ArrayList<HashMap<String,String>>list=new ArrayList<HashMap<String,String>>();
HashMap<String,String>map1=new HashMap<String,String>();
map1.put("user_name","user1"); map1.put("user_ip","192.168.9.1");
list.add(map1);
ListView有一个onListItemClick(ListViewl,View v,int position,long id) 方法可以复写来获得点击控件的位置,id等
关键方法:
android:id="@id/android:list"
setListAdapter(adapter);
new SimpleAdapter(blablabla)
13.Activity的布局
控件的一些属性
android:id
android:gravity //控件中的内容相对于控件本身的位置
android:layout_width layout_height
android:background="#aa0000" //背景颜色RGB ="@android:drawable/editbox_background" android默认的文本框颜色
android:textsize="35pt" //字体大小 pt磅
android:paddingLeft/Top/Right/Bottom="20dip" //dip是与手机屏幕大小无关的单位,也可以用px
android:margin //外边距
android:weight="1" //这个控件相对于别的控件的大小
android:singleLine="true" //是否把内容显示在同一行
layout有LinearLayout TableLayout RelativeLayout
LinearLayout android:orientation="vertical" horizontal
TableLayout中 android:stretchColumns="1" 内容填不满时候拉伸的列号
标签里加<TableRow> </TableRow>
RelativeLayout中的控件属性有
android:layout_above="@id/xxx" below toLeftOf toRightOf //把当前控件放在XXX的上下左右
android:layout_alignBaseline="@id/xxx" alignBottomalignLeft alignRight alignTop //同时把两个控件的上/下/左/右边缘对齐,类似嵌套
android:layout_alignParentBottomalignParentLeft alignParentRight alignParentTop //和父控件对齐边缘,值为true false
android:layout_centerHorizontal centerInParent centerVertical //值为true false
14.Handler用法
一种异步处理机制
首先创建一个Handler对象
Handler barHandler=new Handler(){
@Override
public void handleMessage(Message msg) { //这个handler带的处理消息的机制,如果有线程发送信息Message
// TODO Auto-generated method stub //将由这个handleMessage函数来处理
bar.setProgress(msg.arg1);
barHandler.post(newThread);
}
};
barHandler.post(newThread); //向handler里添加新的线程,这一句是重点
重写线程的run函数来达到在后台执行的目的
Runnable newThread=new Runnable(){
int i=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("BeginThread");
i+=10;
//要发送一个消息到消息队列中去
//生成消息
Message msg=barHandler.obtainMessage(); //获得barHandler的消息
msg.arg1=i; //修改参数arg1
barHandler.sendMessage(msg); //发送消息到消息队列中,让handleMessage方法处理
if(i==100)
barHandler.removeCallbacks(newThread);
}
};
关键方法:
handler.post(newThread); //向handler中加入线程
没有调用newThread的start()方法,直接用了run()方法,其实handler和main还是在同一线程中,并未分开执行,如果要分开执行,需要用HandlerThread类来进行
//先创建一个HandlerThread对象 一个线程
HandlerThread handlerThread=newHandlerThread("handler_thread"); //这里括号的参数是要生成新的线程的名字!!!!
handlerThread.start(); //一个HandlerThread中有一个Looper
Handler myhand=newHandler(handlerThread.getLooper()); //Handler类有一个以looper为参数的构造函数
//这样,新创建的Handler就在一个新的线程中了
//Message msg=myHandler.obtainMessage();
//msg.sendToTarget();
15.Bundle
Bundle b=new Bundle();
b.putInt("Age",15);
b.putString("Name",John);
msg.setData(d);
msg.sendToTarget();
//在handleMessage中
String a=b.getString("Name");
int age=b.getInt("age");
16.SQLite数据库
写一个类继承SQLiteOpenHelper
public class DBHelper extendsSQLiteOpenHelper {
public DBHelper(Context context,Stringname,CursorFactory factory,int version) {
// TODO Auto-generated constructor stub
super(context,name,factory,version); //复写构造函数
}
public void onCreate(SQLiteDatabase db){ //复写OnCreate方法
// TODO Auto-generated method stub
System.out.println("Create a database");
db.execSQL("create table user(id int,name varchar(20))"); //执行创建一个user表
}
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) { //OnUpdate方法
// TODO Auto-generated method stub
System.out.println("Update a database");
}
}
生成一个继承来的类
DBHelper dbHelper=new DBHelper(工程类的名字.this,"数据库名",null,1); //SQLiteOpenHelper是一个数据库的管理类
SQLiteDatabasedb=dbHelper.getWritableDatabase(); //这个时候生成了SQLiteDatabase对象才调用了OnCreate,创建了数据库
ContentValues values=newContentValues(); //插入和更新都要靠ContentValues对象来作为参数传递
values.put("id", 1);
values.put("name", "Vincent");
//表中插入数据
db.insert("user",null,values);
//表中更新数据
db.update("user", values,"id=?", new String[]{"1"}); //表名,插入的值,条件,条件域
//表中查询数据
Cursor cur=db.query("user",new String[]{"id","name"}, "id=?", newString[]{"1"}, null, null, null);
表名 选中的列 限制条件 条件域 groupBy having orderBy
while(cur.moveToNext){
String name =cur.getString(cur.getColumnIndex("name"));
System.out.println("query--->" + name);
}
17.网络文本读取
读取文本文件:即把一个文本内容全部取出
首先,生成一个URL对象
URL url=new URL(urlStr);
再生成一个HttpURLConnection对象
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
返回文件中的内容
urlConn.getInputStream(); //返回一个InputStream对象
newInputStreamReader(urlConn.getInputStream()); //返回一个Reader对象
BufferedReader br=newBufferedReader(new InputStreamReader(urlConn.getInputStream())); //内容存在了一个BufferedReader
StringBuffer sb=new StringBuffer(); String line=null;
因为BufferedReader有getLine功能
while((line=br.getLine())!=null){
sb.append(line);
}
18.下载文件并且放入SD卡中
首先需要在Manifest.xml中添加两个权限
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下载文件需要地址urlStr,存文件需要路径path和保存的文件名fileName
URL url=new URL(urlStr);
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection(); //生成打开链接对象
InputStream is=urlConn.getInputStream(); //从打开链接获得输入内容
//创建存储路径
StringSDPATH=Environment.getExternalStorageDirectory()+"/"; //SD卡存储路径
File dir=new File(SDPATH+path);
dir.mkdir(); //生成文件夹
File file=newFile(SDPATH+path+"/"+fileName); //生成文件
file.createNewFile();
OutputStream outputStream=newFIleOutputStream(file); //生成写文件的输出流
byte[] buffer=new byte[4*1024]; //生成一个缓冲容器 4KB大小
while((input.read(buffer))!=-1) //从输入流中读
outputStream.write(buffer); //写入文件
outputSteam.flush()
inputSteam.close();outputSteam.close();
19.ContentProvider
为存储和获取数据提供统一的接口
可以在不同程序间共享数据
比如取得android系统的联系人信息
Cursorcur=getConentResolver().query(People.CONTENT_URI,null,null,null,null);
startManagingCursor(cur);
ListAdapter listAdapter=newSimpleCursorAdapter(this,andorid.layout.lay,cur,new String[]{People.NAME},newint[]{android.R.id.text});
listView.setAdapter(listAdapter);
如果要自己写一个继承ContentProvider类
要复写insert() query() delete() update() getType()方法,方法内容自己定义就可以达到不同的方式封装数据了
20.XML文件解析 SAX(Simple API for XML)
SAXParserFactory factory=SAXParserFactory.getInstance(); //生成一个SAXParserFactory对象
XMLReaderreader=factory.newSAXParser().getXMLReader();//用factory生成一个SAXParser对象,getXMLReader方法得到Reader
//为XMLReader设置ContentHandler
reader.setContentHandler(newMyContentHandler()); //MyContentHandler是自定义的继承自DefaultHandler的类,下面有类定义
reader.parse(new InputSource(newStringReader(resultString)));
class MyContentHandler extendsDefaultHandler{
Stringname,address,sex,status,money;
StringtagName;
public voidstartDocument() throws SAXException{
System.out.println("-------begin---------");
}
public voidendDocument() throws SAXException{
System.out.println("-------end---------");
}
//当开始读取标签时候
public void startElement(StringnamespaceURI,String localName,String qName,Attributes attr) throwsSAXException{
tagName=localName; //后面在遍历其中子标签的时候有用
System.out.println("-------beginElement---------");
if(localName="worker") //如果标签的名字是worker
for(int i=0;i<attr.length();i++){ //显示所有属性的名和值
System.out.println(attr.getLoacalName(i)+attr.getValue(i));
}
}
public void endElement(StringnamespaceURI,String localName,String qName) throws SAXException{
System.out.println("-------endElement---------");
}
public void characters(char[] ch,intstart,int length) throws SAXException{
System.out.println("-------begin---------");
}
}
21.广播机制BroadcastReceiver
class TestReceiver extendsBroadcastReceiver{
public TestReceiver(){
}
public void onReceive(Contextcontext,Intent intent){
//do something
}
}
在Manifest.xml中注册receiver
<receiverandroid:name=".TestReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.EDIT">
</intent-fliter>
</reveiver>
<uses-permissionandroid:name="android.permission.RECEIVE_SMS">
//此种注册无论程序是否打开,在条件附合时都会进行反应
Intent intent=new Intent();
intent.setAction(Intent.ACTION_EDIT);
sendBoardcast(intent); //发出消息 对比BroadcastReceiver中的action 和intent中的action是否匹配 匹配则需要可以触发Receiver
//在程序中注册receiver
TestReceiver testreceiver=new TestReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telepony.SMS_RECEIVED");
registerReceiver(testreceiver,filter); //getContext.this.registerReceiver(testreceiver,filter);
getContext.this.unregisterReceiver(testreceiver); //解除receiver
在onReceive方法中获得消息的内容
Bundle bundle=intent.getExtras();
Object[]myOBJpdus=(Object[])bundle.get("pdus");
SmsMessage messages=newSmsMessage(myOBJpdus.length);
fot(int i=0;i<myOBJpdus.length;i++)
{
messages[i]=SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
System.out.println( messages[i].getDisplayMessageBody() ); //输出短信内容
}
22.Wifi操作
WifiManager wifimanager=(WifiManager)xxxActivity.this.getSystemService(Context.WIFI_SERVICE);
wifimanager.setWifiEnabled(true); //false为关闭
System.out.println("wifistate----->"+wifimanager.getWifiState());
Toast.makeText(xxxActivity.this,"当前WIFI状态为"+wifimanager.getWifiState(),Toast.LENGTH_SHORT);
记得要在Manifest.xml中获得相应的权限
23.Socket编程
基于TCP协议:
Server服务器端:
启动一个新的线程:newServerThread().start()
class ServerThread extends Thread{
public void run(){
ServerSocket serverSocket=newServerSocket(4567); //生成一个服务器socket对象,监听4567端口
Socketsocket=serverSocket.accept(); //获得服务器端serverSocket接受客户端传来的socket
InputStream inputStream=socket.getInputStream(); //从获得来的socket中取到输入流
byte[] buffer=newbyte[4*1024]; /缓冲容器
int temp=0;
while((temp=inputStream.read(buffer))!=-1)
System.out.println(newString(buffer,0,temp)); //输出获得的内容
}
}
Client客户端:
Socket socket=newSocket("192.168.1.104",4567); //要发送信息到的IP地址,端口
InputStream inputStream =newFileInputStream("D:\a.txt");
OutputStreamoutputStream=socket.getOutputStream(); //获得要发送socket的OutputStream来修改
byte[] buffer=new byte[4*1024];
int temp=0;
while((temp=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,temp);
}
基于UDP协议:
Server服务器端:
public void run(){
DatagramSocket socket=new DatagramSocket(4567); //UDP要用DatagramSocket
byte[] data=new byte[1024];
DatagramPacket packet=newDatagramPacket(data,data.length);
socket.receive(packet); //等待客户端发送包
String result=newString(packet.getData(),packet.getOffset(),packet.getLength());
}
Client客户端:
DatagramSocket socket=newDatagramSocket(4567);
InetAddress serverAddress=InetAddress.getByName("192.168.1.104");
String str="hello";
byte[] data=str.getBytes(); //把string拆成字节数组
DatagramPacket packet=newDatagramPacket(data,data.length(),serverAddress,4567);
socket.send(packet);
TCP按流传递信息,UDP按包传递信息
24.Service
class TestService extends Service{
public IBinder onBind(Intent intent){
}
public void onCreate(){
}
public int onStartCommand(Intent intent,int flags,int startId){
}
public void onDestory(){
}
}
在Manifest.xml中注册
<serviceandroid:name=".TestService"></service>
调用时候:
Intent intent=new Intent();
intent.setClass(TestServiceActivity.this,TestService.class);
startService(intent); //stopService(intent);
25.Annimations动画效果
先创建一个AnimationSet类
AnimationSet animationSet= newAnimationSet(true);
AlaphaAnimation alpha=newAlaphaAnimation(1,0);
alpha.setDuration(1000);
animationSet.addAnimation(alpha);
imageView.StartAnimation(animationSet);