Android基礎知識點總結
在學習了很長一段時間的Android基礎內容,如果不做及時的複習,那麼後面的項目學習起來可能就沒那麼順利了,並且複習也是一件很愉快的事。古人有云:“學而時習之不亦說乎”,應該就是這個道理。
~本文大綱~
Day01
第一天主要學習的內容相對零散一點,但還是很重要的。
01、Android系統中我們常用的4種數據存儲方式★★★★★
1. SharedPreferences存儲數據
2. getFilesDir數據存儲在手機上
3. Environment數據存儲在SD卡上
4. SQLite數據庫存儲
1、SharedPreferences存儲數據
保存數據
SharedPreferences config = getSharedPreferences("config", MODE_PRIVATE);
boolean commit = config.edit().putString("Hsia", mContent).commit();
if (commit) {
Toast.makeText(getApplicationContext(), "數據保存成功!", Toast.LENGTH_SHORT).show();
mEtContent.setText("");
}
取回數據
String getConfig = getSharedPreferences("config", MODE_PRIVATE).getString("Hsia", "");
if (!("".equals(getConfig))) {
Toast.makeText(getApplicationContext(), "數據取回成功!", Toast.LENGTH_SHORT).show();
mEtContent.setText(getConfig);
}
2、getFilesDir數據存儲在手機上
/**
* 獲取已保存的用戶信息
* @param context
* @return
*/
private String getConfigFile(Context context) {
try {
BufferedReader br = new BufferedReader(new FileReader(new File(context.getFilesDir(), FILENAME)));
String data = br.readLine();
br.close();
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 保存用戶信息到手機上
* @param context
* @param mContent
* @return
*/
private boolean SaveConfig(Context context, String mContent) {
if (mContent != null) {
File file = new File(context.getFilesDir(),FILENAME);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write(mContent);
bw.newLine();
bw.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}else{
return false;
}
}
3、Environment數據存儲在SD卡上
/**
* 從sd卡中取出數據
* @return
*/
private String SDGetConfig() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
try {
FileReader fr = new FileReader(new File(Environment.getExternalStorageDirectory() + SDDownload, FILENAME));
int len = 0;
char[] chs = new char[1024];
String data = "";
while((len = fr.read(chs))!=-1){
data = new String(chs,0,len);
}
fr.close();
return data;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 保存數據到sd卡中
* @param mContent
* @return
*/
private boolean SDSaveConfig(String mContent) {
//判斷sd卡是否存在
String state = Environment.getExternalStorageState();
//如果sd卡不存在直接返回false
if (!(Environment.MEDIA_MOUNTED.equals(state))) {
return false;
}else{
try {
FileWriter fw = new FileWriter(new File(Environment.getExternalStorageDirectory() + SDDownload, FILENAME));
fw.write(mContent);
fw.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
- SharedPreferences存儲數據,會在當前包名下,生成一個“shared_prefs”文件夾,配置文件放在該目錄下。
- getFilesDir存儲數據,會在當前包名下,生成一個“files”文件夾,配置文件放在該目錄下。
- Environment存儲數據,獲取到SD卡根目錄,文件默認會存放在SD卡根目錄中。
4、SQLite數據庫存儲(相對知識點較多暫時不做演示)
02、獲取手機內存空間大小★★★
由於獲取手機空間大小實際開發中使用較少,並且相對簡單,就不做代碼測試了,主要就用到Environment(獲取SD卡空間)和getFilesDir(獲取手機空間)。
關鍵代碼
- 獲取SD卡空間大小
File storageDirectory = Environment.getExternalStorageDirectory();
long totalSpace = storageDirectory.getTotalSpace();
long usableSpace = storageDirectory.getUsableSpace();
- 獲取手機空間大小
File filesDir = getFilesDir();
long totalSpace = filesDir.getTotalSpace();
long usableSpace = filesDir.getUsableSpace();
String totalSpaceStr = Formatter.formatFileSize(this, totalSpace);
String usableSpaceStr = Formatter.formatFileSize(this, usableSpace);
03、XML文件的生成和解析★★★
- 生成XML文件
/**
* 生成XML文件的方法
* @return
*/
private boolean MakeXML() {
//Xml.newSerializer開始拼接數據生成xml
XmlSerializer xmlSerializer = Xml.newSerializer();
//設置xml文件的存放路徑
File file = new File(getFilesDir(), "makeXML.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
xmlSerializer.setOutput(fos,"utf-8");
//開始寫xml
xmlSerializer.startDocument("utf-8",true);
//開始寫xml的根節點
xmlSerializer.startTag(null,"Message");
for (int i = 0; i < 5; i++) {
xmlSerializer.startTag(null,"sms");
xmlSerializer.startTag(null,"address");
xmlSerializer.text("15855225588");
xmlSerializer.endTag(null,"address");
xmlSerializer.startTag(null,"name");
xmlSerializer.text("Hsia");
xmlSerializer.endTag(null,"name");
xmlSerializer.startTag(null,"body");
xmlSerializer.text("Hello!!!!");
xmlSerializer.endTag(null,"body");
xmlSerializer.endTag(null,"sms");
}
xmlSerializer.endTag(null,"Message");
xmlSerializer.endDocument();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
- 解析XML文件
/**
* 解析XML的方法
* @param file
* @return
*/
private List<Weather> GetResolveXML(File file) {
XmlPullParser parser = Xml.newPullParser();
FileInputStream fis = null;
List<Weather> list = null;
Weather weather = null;
try {
fis = new FileInputStream(file);
parser.setInput(fis,"utf-8");
int type = parser.next();
while(type!=XmlPullParser.END_DOCUMENT){
if (type==XmlPullParser.START_TAG) {
list = new ArrayList<>();
//如果開始標籤是weather標籤則實例化weather
if ("weather".equals(parser.getName())) {
weather = new Weather();
}else if ("city".equals(parser.getName())) {
//獲取節點下的屬性值
String id = parser.nextText();
weather.setId(id);
}else if ("name".equals(parser.getName())) {
String name = parser.nextText();
weather.setName(name);
}else if ("pm".equals(parser.getName())) {
String pm = parser.nextText();
weather.setPm(pm);
}else if ("wind".equals(parser.getName())) {
String wind = parser.nextText();
weather.setWind(wind);
}else if ("temp".equals(parser.getName())) {
String temp = parser.nextText();
weather.setTemp(temp);
}
}
type = parser.next();
list.add(weather);
}
fis.close();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
GET新技能
1、將LogCat信息顯示在控制檯中
在控制檯中輸入adb logcat 然後按回車鍵即可看到LogCat信息,如果需要終止按Ctrl+C鍵即可。
2、將LogCat信息保存在文件中
執行adb logcat >D:/a.txt 則將日誌輸出到D:/a.txt文件中。按Ctrl+C鍵終止日誌的輸出。
Day02
主要學習Android-SQLite和ListView控件的使用
SQLiteOpenHelper的基本用法
1、SQLiteOpenHelper一般就是寫一個類,繼承SQLiteOpenHelper來創建一個數據庫。
public class MyOpenHelp extends SQLiteOpenHelper {
public MyOpenHelp(Context context) {
super(context, "person.db", null, 1);
}
/**
* Called when the database is created for the first time
* 當 數據第一次創建的時候調用
* 該方法適合做 表結構的初始化
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("oncreate");
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
}
/**
* 當數據庫需要升級的時候調用
* 該方法適合做 表結構修改
*
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onUpgrade");
}
}
2、新建一個針對數據庫的操作類
/**
* Created by Hsia on 16/5/12.
* E-mail: [email protected]
* //TODO:對數據操作的類
*/
public class PersonDao {
private final MyOpenHelp help;
public PersonDao(Context context) {
help = new MyOpenHelp(context);
}
/**
* 插入數據到數據庫的方法
* @param name
* @param phone
* @return
*/
public boolean add(String name,String phone){
SQLiteDatabase db = help.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name",name);
values.put("phone",phone);
long l = db.insert("info", null, values);
//關閉下數據庫
db.close();
if (l == -1){
return false;
}else{
return true;
}
}
/**
* 數據庫的刪除方法
* @param name
* @return
*/
public int del(String name){
SQLiteDatabase db = help.getWritableDatabase();
int info = db.delete("info", "name = ?", new String[]{name});
return info;
}
/**
* 更改數據庫,通過名字更改號碼
* @param name
* @param phone
* @return
*/
public int update(String name,String phone){
SQLiteDatabase db = help.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone",phone);
int info = db.update("info", values, "name = ?", new String[]{name});
return info;
}
public String find(){
SQLiteDatabase db = help.getWritableDatabase();
//查詢到結果集
/**
* table 表名
* columns 查詢的列 具體查詢的是哪一列
* selection 根據什麼條件去
* selectionArgs
*/
Cursor cursor = db.query("info", null, null, null, null, null, null);
String name = "";
String phone = "";
while (cursor.moveToNext()){
//獲取數據庫中String數據
name = cursor.getString(0);
phone = cursor.getString(1);
}
db.close();
if (TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)) {
return null;
}else {
return name +","+ phone;
}
}
}
3、對數據庫進行增刪改查
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_add:
boolean zhansan = dao.add("zhansan", "13888888");
if (zhansan){
Toast.makeText(this, "數據添加成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "數據插入失敗", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_del:
int del = dao.del("zhansan");
if (del >1) {
Toast.makeText(this, "刪除了" + del + "行", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "數據庫已經沒有數據了", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_update:
int update = dao.update("zhansan", "1377");
Toast.makeText(this, "更改了" + update + "行數據", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_find:
String find = dao.find();
if (find != null) {
String[] split = find.split(",");
String name = split[0];
String phone = split[1];
Toast.makeText(this, "查詢結果:" + name + "," + phone, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "數據庫中,沒有數據了", Toast.LENGTH_SHORT).show();
}
break;
}
}
數據庫事務
即同一組操作要麼同時成功,要麼同時失敗.
public void click(View view){
db.beginTransaction();
try {
// 做銀行轉賬的邏輯
db.execSQL("update account set money = money - 100 where name = ?",
new Object[] { "張三" });
// 模擬一個異常
int i = 1 / 0;
db.execSQL("update account set money = money + 100 where name = ?",
new Object[] { "李四" });
// 設置一個成功標記 如果該句話執行了 說明我們事務成功 如有有異常 就會回滾
db.setTransactionSuccessful();
} catch (Exception e){
Toast.makeText(getApplicationContext(), "數據庫操作失敗,數據已回滾到上個版本", Toast.LENGTH_SHORT).show();
} finally {
db.endTransaction();
}
Listview的簡單優化
if (convertView == null) {
//歷史緩存對象爲空 我創建一個新的View 對象
tv = new TextView(getApplicationContext());
System.out.println("創建新的view對象--"+position);
}else {
//歷史緩存對象不爲空
tv = (TextView) convertView;
System.out.println("複用歷史緩存對象--"+position);
}
複用歷史緩存對象
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.lv);
MyAdapter myAdapter = new MyAdapter();
listView.setAdapter(myAdapter);
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
//listview優化
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
//如果爲空就創建view對象
if (convertView == null) {
view = View.inflate(getApplicationContext(), R.layout.item, null);
System.out.println("Hsia:創建listview對象"+position);
//不爲空就複用 view對象
}else {
view = convertView;
System.out.println("Hsia:複用listview歷史對象"+position);
}
return view;
}
}
day03
主要學習Android下訪問網絡的操作,涉及到Handle消息機制的處理
消息機制的寫法
(1)在主線程創建一個Handler 對象
(2)重寫Handler的HandleMessage方法
(3)拿着handler 去子線程發送一條消息
(4)發送完消息後 handleMessage方法就會執行
網絡圖片查看器
public class MainActivity extends AppCompatActivity {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
switch (what){
case 1:
Toast.makeText(MainActivity.this, "訪問網絡失敗", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
super.handleMessage(msg);
final Bitmap bitmap = (Bitmap) msg.obj;
Toast.makeText(MainActivity.this, "3秒後執行", Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmap);
}
},3000);
}
};
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
}
public void look(View view){
lookPng();
}
private void lookPng() {
new Thread(){
@Override
public void run() {
String path = "https://img.alicdn.com/tps/i1/TB1h3IXGFXXXXXsXFXXDANtWXXX-175-175.png_.webp";
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(path).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
InputStream inputStream = conn.getInputStream();
//將獲取的流數據轉爲bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//通過handle更新UI
//obtain 實現了new Message ,裏面是一個線程池
Message msg = Message.obtain();
msg.obj = bitmap;
handler.sendMessage(msg);
}else{
handler.sendEmptyMessage(1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
備註:關於訪問網絡的內容暫時就寫這麼多了,後面什麼Httpclient,由於谷歌在Android5.0的時候已經廢棄了,所以,不做贅述。
day04
day05
Android學習從零單排之BroadcastReceiver
day06
day07
day08
Android學習從零單排之Androidmultimedia(多媒體)
day09
由於學習時間有限,以上部分,就不做總結了,請參考鏈接。
關於作者
- 個人網站:北京互聯科技
- Email:[email protected]
- 項目地址:https://github.com/swordman20/AndroidBaseContent.git