Android基礎學習筆記--Mars篇


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");
}
}
});
關鍵方法:
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);           
                            }
                   };

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);
                     }
         };

關鍵方法:
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);               //復寫構造函數
}
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是一個數據庫的管理類
SQLiteDatabase db=dbHelper.getWritableDatabase(); //這個時候生成了SQLiteDatabase對象才調用了OnCreate,創建了數據庫

ContentValues values=new ContentValues();       //插入和更新都要靠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=?", new String[]{"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對象
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"/>

下載文件需要地址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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM