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類
Button mybutton=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中設置了<string name="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(new MyButtonListener());
在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(Menu menu)方法
然后用menu.add(0,1,1,string)來添加MENU選項
要編寫每個選項實現的功能要重寫onOptionsItemSelected(MenuItem item)方法
其中關鍵方法:menu.add(int groupId,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(new RadioGroup.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");
}
}
});
@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(new RadioGroup.OnCheckedListener()
{
public void OnCheckedChange(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(ListView l,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" alignBottom alignLeft alignRight alignTop //同時把兩個控件的上/下/左/右邊緣對齊,類似嵌套
android:layout_alignParentBottom alignParentLeft 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);
}
@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("Begin Thread");
i+=10;
//要發送一個消息到消息隊列中去
//生成消息
Message msg=barHandler.obtainMessage(); //獲得barHandler的消息
msg.arg1=i; //修改參數arg1
barHandler.sendMessage(msg); //發送消息到消息隊列中,讓handleMessage方法處理
if(i==100)
barHandler.removeCallbacks(newThread);
}
};
int i=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Begin Thread");
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=new HandlerThread("handler_thread"); //這里括號的參數是要生成新的線程的名字!!!!
handlerThread.start(); //一個HandlerThread中有一個Looper
Handler myhand=new Handler(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 extends SQLiteOpenHelper {
public DBHelper(Context context,String name,CursorFactory factory,int version) {
// TODO Auto-generated constructor stub
super(context,name,factory,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表
}
// 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");
}
// TODO Auto-generated method stub
System.out.println("Update a database");
}
}
生成一個繼承來的類
DBHelper dbHelper=new DBHelper(工程類的名字.this,"數據庫名",null,1); //SQLiteOpenHelper是一個數據庫的管理類
SQLiteDatabase db=dbHelper.getWritableDatabase(); //這個時候生成了SQLiteDatabase對象才調用了OnCreate,創建了數據庫
ContentValues values=new ContentValues(); //插入和更新都要靠ContentValues對象來作為參數傳遞
values.put("id", 1);
values.put("name", "Vincent");
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=?", new String[]{"1"}, null, null, null);
表名 選中的列 限制條件 條件域 groupBy having orderBy
while(cur.moveToNext){
String name = cur.getString(cur.getColumnIndex("name"));
System.out.println("query--->" + name);
System.out.println("query--->" + name);
}
17.網絡文本讀取
讀取文本文件:即把一個文本內容全部取出
首先,生成一個URL對象
URL url=new URL(urlStr);
再生成一個HttpURLConnection對象
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
返回文件中的內容
urlConn.getInputStream(); //返回一個InputStream對象
new InputStreamReader(urlConn.getInputStream()); //返回一個Reader對象
BufferedReader br=new BufferedReader(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-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下載文件需要地址urlStr,存文件需要路徑path和保存的文件名fileName
URL url=new URL(urlStr);
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); //生成打開鏈接對象
InputStream is=urlConn.getInputStream(); //從打開鏈接獲得輸入內容
//創建存儲路徑
String SDPATH=Environment.getExternalStorageDirectory()+"/"; //SD卡存儲路徑
File dir=new File(SDPATH+path);
dir.mkdir(); //生成文件夾
File file=new File(SDPATH+path+"/"+fileName); //生成文件
file.createNewFile();
OutputStream outputStream=new FIleOutputStream(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系統的聯系人信息
Cursor cur=getConentResolver().query(People.CONTENT_URI,null,null,null,null);
startManagingCursor(cur);
ListAdapter listAdapter=new SimpleCursorAdapter(this,andorid.layout.lay,cur,new String[]{People.NAME},new int[]{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對象
XMLReader reader=factory.newSAXParser().getXMLReader();//用factory生成一個SAXParser對象,getXMLReader方法得到Reader
//為XMLReader設置ContentHandler
reader.setContentHandler(new MyContentHandler()); //MyContentHandler是自定義的繼承自DefaultHandler的類,下面有類定義
reader.parse(new InputSource(new StringReader(resultString)));
class MyContentHandler extends DefaultHandler{
String name,address,sex,status,money;
String tagName;
public void startDocument() throws SAXException{
System.out.println("-------begin---------");
}
public void endDocument() throws SAXException{
System.out.println("-------end---------");
}
//當開始讀取標簽時候
public void startElement(String namespaceURI,String localName,String qName,Attributes attr) throws SAXException{
tagName=localName; //后面在遍歷其中子標簽的時候有用
System.out.println("-------begin Element---------");
if(localName="worker") //如果標簽的名字是worker
for(int i=0;i<attr.length();i++){ //顯示所有屬性的名和值
System.out.println(attr.getLoacalName(i)+attr.getValue(i));
}
}
public void endElement(String namespaceURI,String localName,String qName) throws SAXException{
System.out.println("-------end Element---------");
}
public void characters(char[] ch,int start,int length) throws SAXException{
System.out.println("-------begin---------");
}
}
21.廣播機制BroadcastReceiver
class TestReceiver extends BroadcastReceiver{
public TestReceiver(){
}
public void onReceive(Context context,Intent intent){
//do something
}
}
在Manifest.xml中注冊receiver
<receiver android:name=".TestReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT">
</intent-fliter>
</reveiver>
<uses-permission android: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=new SmsMessage(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("wifi state----->"+wifimanager.getWifiState());
Toast.makeText(xxxActivity.this,"當前WIFI狀態為"+wifimanager.getWifiState(),Toast.LENGTH_SHORT);
記得要在Manifest.xml中獲得相應的權限
23.Socket編程
基於TCP協議:
Server服務器端:
啟動一個新的線程:new ServerThread().start()
class ServerThread extends Thread{
public void run(){
ServerSocket serverSocket=new ServerSocket(4567); //生成一個服務器socket對象,監聽4567端口
Socket socket=serverSocket.accept(); //獲得服務器端serverSocket接受客戶端傳來的socket
InputStream inputStream=socket.getInputStream(); //從獲得來的socket中取到輸入流
byte[] buffer=new byte[4*1024]; /緩沖容器
int temp=0;
while((temp=inputStream.read(buffer))!=-1)
System.out.println(new String(buffer,0,temp)); //輸出獲得的內容
}
}
Client客戶端:
Socket socket=new Socket("192.168.1.104",4567); //要發送信息到的IP地址,端口
InputStream inputStream =new FileInputStream("D:\a.txt");
OutputStream outputStream=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=new DatagramPacket(data,data.length);
socket.receive(packet); //等待客戶端發送包
String result=new String(packet.getData(),packet.getOffset(),packet.getLength());
}
Client客戶端:
DatagramSocket socket=new DatagramSocket(4567);
InetAddress serverAddress =InetAddress.getByName("192.168.1.104");
String str="hello";
byte[] data=str.getBytes(); //把string拆成字節數組
DatagramPacket packet=new DatagramPacket(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中注冊
<service android:name=".TestService"></service>
調用時候:
Intent intent=new Intent();
intent.setClass(TestServiceActivity.this,TestService.class);
startService(intent); //stopService(intent);
25.Annimations動畫效果
先創建一個AnimationSet類
AnimationSet animationSet= new AnimationSet(true);
AlaphaAnimation alpha=new AlaphaAnimation(1,0);
alpha.setDuration(1000);
animationSet.addAnimation(alpha);
imageView.StartAnimation(animationSet);