標籤:
第一天:
adb命令:
adb devices 列出所有的裝置
adb shell 掛載到Linux的空間,可以執行Linux指令
adb install xxx.apk 如果多個裝置adb install -s 裝置名稱
adb push 把檔案推到手機裡
adb pull把檔案從手機裡拉出來
netstat -ano查看連接埠號碼
taskkill /pid pid /f 殺死pid對應的進程
電話撥號器
1、找到控制項並且得到控制項對象
et_phone = (EditText) findViewById(R.id.et_phone);
Button bt_call = (Button) findViewById(R.id.bt_call);
2、為按鈕設定點擊事件,並且拿到使用者在文字框中輸入的值
String phone = et_phone.getText().toString().trim();
3、建立一個撥打到電話的意圖,並開啟
Intent intent = new Intent();
//設定撥打到電話號碼的動作
intent.setAction(Intent.ACTION_CALL);
//設定撥打的電話號碼
intent.setData(Uri.parse("tel://"+phone));
//開啟撥打到電話的意圖
startActivity(intent);
四種點擊事件
1、採用內部類的方式去實現OnClickListener
2、使用匿名內部類
3、讓當前類去實現OnClickListener,並實現未實現的方法
4、在layout檔案的Button中定義onclick方法,並在代碼中去實現對應的方法
標準:public void XXX(View view){}
第二天:
1、Junit測試方法
寫一個測試類別繼承AndroidTestCase類
在資訊清單檔中添加
<!-- 添加指令集,添加到manifest節點裡面,指令集會把應用程式部署到模擬器上運行 -->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima.junit">
</instrumentation>
<!-- 添加JUnit的測試包 ,添加到application節點的裡面-->
<uses-library android:name="android.test.runner"/>
2、從檔案中讀取資料並顯示到控制項
1、把檔案儲存到SD卡
File file = new File(Environment.getExternalStorageDirectory(),"xx.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write("xxx".getBytes());
fos.close();
2、從SD卡中讀取檔案
File file = new File(Environment.getExternalStorageDirectory(),"xx.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String info = br.readLine();
3、在資訊清單檔中添加訪問SD卡的許可權
寫SD卡
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
讀SD卡
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3、SharedPreferences儲存和讀取資料
儲存資料
SharedPreferences sp = getSharedPreferences("xxx",0);
sp.edit.putString("Key","Value").commit;
讀取資料
String data = sp.getString("Key","預設值");
4、XML檔案的建立與解析
1、建立XML檔案
1、初始化一個xml檔案的序列化器
XmlSerializer serializer = XML.newSerializer();
2、初始化序列器參數
File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos,"UTF-8");
//3.開始寫xml檔案.
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "smss");
//開始寫body節點
serializer.startTag(null, "body");
serializer.text(info.getBody());
//body節點結束
serializer.endTag(null, "body");
//smss根節點結束
serializer.endTag(null, "smss");
//xml 結束
serializer.endDocument();
fos.close();
2、解析XML檔案
/**
* 解析伺服器返回的資料 擷取天氣資訊
* @param is 伺服器返回的包含天氣資訊的流 (xml)
* @return
*/
public static List<Channel> getAllWeatherInfos(InputStream is) throws Exception{
List<Channel> channels = null;
Channel channel = null;
//1.擷取xml解析器
XmlPullParser parser = Xml.newPullParser();
//2.設定xml解析器的參數
parser.setInput(is, "utf-8");
//3.開始解析xml檔案.
int type = parser.getEventType();// 擷取當前的事件的類型
while (type!=XmlPullParser.END_DOCUMENT){ //需要讓pull解析器解析到檔案的末尾
switch (type) {
case XmlPullParser.START_TAG:
if("weather".equals(parser.getName())){//總的開始節點
channels = new ArrayList<Channel>(); //初始化集合
}else if("channel".equals(parser.getName())){//某個城市的資訊開始了.
channel = new Channel();
//擷取到id的屬性值
String id = parser.getAttributeValue(0);
channel.setId(Integer.parseInt(id));
//解析city節點
}
break;
//判斷xml的結束節點
case XmlPullParser.END_TAG:
if("channel".equals(parser.getName())){
//把解析的內容加入到集合中
channels.add(channel);
channel = null;
}
break;
}
type = parser.next();
}
is.close();
return channels;//把所有的頻道的集合返回回去
}
第三天:
1、建立資料庫的步驟
建立一個類繼承SQLiteOpenHelper
//建立資料庫
DBHelper helper = new DBHelper(this, "account.db", null, 1);
onCreate是在資料庫建立的時候調用的,主要用來初始化資料表結構和插入資料初始化的記錄
onUpGrade是在資料庫版本升級的時候調用的,主要用來改變表結構
1、插入資料
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
long rowId = db.insert("person", null, values);
2、查詢資料
Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
while(cursor.moveToNext()){
int id = cursor.getInt(0);
String name = cursor.getString(1);
System.out.println("id="+id+"; name="+name);
}
3、更新資料
ContentValues values = new ContentValues();
values.put("name", "wangwu");
db.update("person", values, "id=?", new String[]{"1"});
4、刪除資料
db.delete("person", "id=?", new String[]{"2"});
2、ListView的使用
1、得到ListView對象
2、lv.setAdapter(new MyAdapter())填充資料
3、建立一個類繼承BaseAdapter並實現未實現的方法
主要是getCount和getView
TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
Person p = list.get(position);
tv_id.setText(p.getId()+"");
tv_name.setText(p.getName());
return view;
第四天:
1、網狀圖片查看器
1、發送請求
1、建立一個URL對象
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
2、佈建要求頭資訊
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
2、伺服器返回資料
1、判斷狀態代碼200 ok,404 沒有找到資源、503、509 伺服器端錯誤
conn.getResponseCode();
2、解析伺服器返回的位元據
InputStream is = conn.getInputStream();
String data = StreamTools.readStream(is);
3、把圖片顯示在控制項上
Message msg = Message.obtain();
msg.obj = data;
handler.sendMessage(msg);
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
String data = (String) msg.obj;
tv_content.setText(data);
};
};
4、添加訪問互連網的許可權:
<uses-permission android:name="android.permission.INTERNET"/>
2、線程不能修改UI介面
activity中的onCreate方法和點擊事件的方法都是運行在主線程中的
只有建立UI介面的那個線程才能修改UI Only the original thread that created a view hierarchy can touch its views.
主線程(UI線程):只有主線程才能修改UI,如果子線程修改UI,系統驗證當前線程是不是主線程,如果不是主線程,就會終止運行
runOnUiThread
3、訊息處理機制的原理
步驟:
1、主線程中建立handler
private Handler handler = new Handler(){};
2、線上程中得到handler的引用,調用發送訊息的方法
Message msg = new Message();
msg.obj = bm;
handler.sendMessage(msg);
3、handler修改UI介面
public void handleMessage(Message msg){
super.handleMessage(msg);
//2、handler修改UI介面
Bitmap bm = (Bitmap) msg.obj;
iv.setImageBitmap(bm);
}
Handler、Message、Looper(訊息處理機制的原理):
前提知識
所有使用UI介面的作業系統,後台都運行著一個死迴圈,在不停的監視和接受使用者發送的指令,一旦接受指令就立即執行
當我們的Android應用程式的進程一建立的時候,系統就給這個進程提供了一個Looper
Looper是一個死迴圈,它內部維護這個一個訊息佇列,Loop不停地從訊息佇列中取訊息(Message),取到訊息就發送給了Handler,最後Handler根據接收到的訊息去修改UI。
4、使用POST方式提交資料
業務情境:
1、使用者登入
2、檔案上傳
1、佈建要求頭資訊POST、Content-Length:
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//必須添加的兩個要求標頭資訊
conn.setRequestProperty("Content-Length", data.length()+"");
conn.setRequestMethod("POST");
2、設定把資料提交到伺服器端:
conn.setDoOutput(true);
//把資料寫到伺服器端
conn.getOutputStream().write(data.getBytes());
缺點:
1、代碼複雜
優點:
1、安全;
2、提交大量的資料
第五天:
1、使用POST方式提交資料是的中文亂碼解決方案
解決辦法:使用用戶端和伺服器兩邊的字元集編碼保持一致。UTF-8,
2、 使用GET方式提交資料的中文亂碼的解決方案
使用URLEncoder.encode(name,"UTF-8")進行url編碼:
String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(pwd,"UTF-8");
3、
第六天:
1、顯和隱式意圖的區別
顯只能開啟自己應用程式中的介面
隱式意圖可以開啟別的應用程式的介面
2、意圖的設計的目的
解耦,實現應用程式的高內聚、低耦合.保證應用程式之間能夠相互獨立運行,又能彼此相互調用
保證自己寫代碼能夠重複使用
結構師:保證項目多快好省的把項目做完
3、Activity的生命週期
onCreate:在activity被建立的時候調用,初始化介面
onStart:當介面可見的時候調用
onResume:按鈕可以被點擊的時候
onPause:按鈕失去焦點的時候
onStop:介面不可見的時候調用
onDestroy:銷毀activity執行個體
1、activity建立時調用onCreate、onStart、onResume;
2、關閉activity時調用:onPause、onStop、onDestroy;
3、最小化activity時調用:onPause、onStop;
4、最小後重新打時調用:onRestart、onStart、onResume;
4、啟動模式
singletop:單一頂部模式在activity的設定檔中設定android:launchMode="singleTop"
如果任務棧的棧頂存在這個要開啟的activity,不會重新的建立activity,而是複用已經存在的activity。保證棧頂如果存在,不會重複建立。
應用情境:瀏覽器的書籤
singletask:單一任務棧,在當前任務棧裡面只能有一個執行個體存在
如果有執行個體存在,則清空這個執行個體上面的所有別的activity,並複用這個執行個體
應用情境:瀏覽器的activity
singleInstance:啟動模式非常特殊,activity會運行在自己的任務棧裡面,並且這個任務棧裡面只有一個執行個體存在
如果你要保證一個activity在整個手機作業系統裡面只有一個執行個體存在,使用singleInstance
應用情境: 來電頁面 有道詞典
第七天:
如何建立廣播
1、建立一個類,繼承BroadcastReceiver類,並重寫onReceive方法
2、在資訊清單檔中註冊
<receiver android:name="包名.類名" />
3、在意圖過濾器中指定要過濾的內容
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
4、自訂廣播
1、建立一個傳遞訊息的意圖對象
Intent intent = new Intent();
2、設定要廣播的事件類型
intent.setAction("自訂包名");
3、設定廣播的訊息資料
intent.putExtra("Key","Value");
4、發送一個廣播
sendBroadcast(intent);
5、發送有序廣播
Intent intent = new Intent();
intent.setAction("com.itheima.orderedbroadcast.ZYFFNTBT");
//發送一個有序的廣播
//intent 意圖
//permission 指定接收者需要添加了許可權
//resultReceiver 指定哪個廣播接收者最後接到訊息
//scheduler 訊息處理器
//initialCode 給訊息指定初始代碼
//initialData 指定訊息的資料
//initialExtras 指定額外的參數
sendOrderedBroadcast(intent, null, null, null, 1, "廣播內容..", null);
廣播接收者的設定檔:
<receiver android:name="com.itheima.zf.ProvinceBroadCastReceiver">
<intent-filter android:priority="1000" >
<action android:name="com.itheima.orderedbroadcast.ZYFFNTBT"/>
</intent-filter>
</receiver>
廣播接收者的代碼:
String info = getResultData();
System.out.println("---------廣播內容:"+info);
修改廣播內容
setResultData("國務院開始發放2014年農田補貼:400元");
第八天:
1、什麼是服務
Windows下的服務:沒有介面、長期運行在背景應用程式
Android下的服務:應用程式的一個組件,沒有介面activity,長期運行在後台
進程:是應用程式啟動並執行載體
進程與應用程式直接的關係:Linux作業系統建立一個進程,這個進程負責運行dalvik虛擬機器,Android的應用程式都是運行在dalvik虛擬機器上的
2、進程的生命週期
1、應用程式一啟動的時候就建立了進程
2、當應用程式退出的時候進程並沒有退出
3、只有手工停止這個進程,進程才會結束
瞭解:作業系統盡量長時間運行應用程式的進程,為了保證記憶體空間不被大量佔用,它會按照進程的優先順序,從低到高一級一級的殺死進程,直到記憶體空間被清理的差不多為止
3、進程的等級
1、Foreground process(前台進程)
應用程式,使用者正在操作,activity的onResume方法被執行了,可以響應點擊事件
2、Visible process(可視進程)
應用程式的UI介面,使用者還可以看到,但是不能操作了
3、Service process(服務進程)
應用程式沒有介面,但是有一個背景服務還處於運行狀態
4、Background process(後台進程)
應用程式沒有服務處於運行狀態,應用程式被最小化了,activity執行了onStop方法
5、Empty process(空進程)
沒有任何組件運行,所有的activity都關閉了,任務棧清空了
4、服務的特點
服務被建立時調用onCreate、onStartCommand
服務只能被建立一次,可以開啟多次onStartCommand
服務只能被停止一次
沒有onPause、onStop、onResume、onRestart方法,因為service沒有介面,長期運行在後台。
5、bind方式開啟服務的生命週期
bindService綁定服務、unBindService解除綁定的服務
服務是在被綁定的時候被建立,調用onUnbind、onDestrory方法,如果多次解除綁定會拋出異常
推薦的方式:
startService:開啟並建立一個服務,服務長期運行在後台;
bindService:綁定服務,可以調用服務裡面的方法;
unBindService:解除服務,停止服務裡面的方法;
stopService:停止服務,銷毀服務物件;
08_遠程服務aidl的寫法(重點)
本地服務:寫在自己的應用程式的工程裡的服務 ,使用自己應用程式的進程運行這個服務;
遠程服務:寫在別的應用程式的工程裡的服務,使用別的應用程式的進程運行這個服務(安裝在同一個手機上的應用程式);
IPC: Inter Process Communication(進程間的通訊);
aidl: Android Interface definition language 安卓介面定義語言;
aidl的介面類裡面不需要public 、protected、private 等修飾符,預設是公開共用;
步驟:
1、建立一個服務的介面類,裡麵包含需要對外暴露的商務邏輯方法:
2、讓服務中的中間人實現了服務的介面類:
3、修改並拷貝介面檔案:
4、在本地服務的工程中的activity裡,綁定服務:
5、通過介面調用遠程服務的方法:
第九天:
1、如何使用內容提供者
定義類繼承 ContentProvider,根據需要重寫內部方法
2、在資訊清單檔的<application>節點下進行配置,<provider標籤中需要>
第十天:
1、在記憶體中建立原圖的副本
1、得到原圖
Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv);
2、建立一個空白的紙張,參考原圖
Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig());
3、建立一個畫板,參考空白紙張
Canvas canvas = new Canvas(copyPic);
4、建立一個畫筆
Paint paint = new Paint();
//預設是使用黑色,後面會根據原圖的顏色畫畫
paint.setColor(Color.BLACK);
5、在畫板上畫畫
canvas.drawBitmap(srcPic, matrix,paint);
6、為控制項設定圖片
iv.setImageBitmap(copyPic);
1、獲得裝置螢幕的解析度
WindowManager wm = getSystemService(WINDOW_SERVICE);
獲得裝置解析度對象
Display display = wm.getDefaultDisplay();
按照比例值縮放圖片
opts.inJustDecodeBounds = false;
opts.inSampleSize = scale; // 1/scale * 1/scale
Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/lp.jpg", opts);
Android核心基礎學習進程