目錄(點擊標題即可下載):
一、新建DemoActivity:
-
在res/layout/下新建activity_demo.xml
-
在manifests/文件夾下的AndroidManifest.xml注冊(可使用Alt+Enter快捷方式)
-
新建DemoActivity繼承Activity,並覆寫onCreate(),在里面添加setContentView指向資源文件夾下的DemoActivity
二、使用匿名類設置事件監聽
-
findViewById()找到View資源,設置監聽。調用View對象的一個方法setOnClickListener,該方法的參數為OnClickListener,但是該方法是一個接口,需要重寫方法onClick。
三、使用Intent跳轉不同的Activity
Intent intent = new Intent(MainActivity.this, DemoActivity.this); startActivtiy(intent);
一、對Button注冊鼠標點擊事件
二、使用Intent實現點擊操作的事件:打開指定網頁、打開相機、打開電話頁面、設置無線網等等。
//打開百度網頁 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent);
一、通過findViewById()找到View資源,封裝成findView()函數
二、對View資源設置點擊監聽器setOnClickListener,封裝成setListener()函數
三、實現View.OnClickListener接口,並覆寫onClick()方法.
@Override public void onClick(View view) { switch (view.getId()) { case R.id.helloWorld1: Log.i("textView1","helloWorld1"); break; case R.id.helloWorld2: Log.i("textView2","helloWorld2"); break; } }
使用RelativeLayout布局界面
一、使用RelativeLayout布局界面,將彩虹放在中央,android:layout_centerInParent="true"。
二、使用LinearLayout布局將View垂直放置,android:orientation="vertical"。
使用RelativeLayout作為整體布局,分別用LinearLayout布局放置線性布局,用RelativeLayout布局放置相對布局。
三類常用監聽事件:View.OnLongClickListener、View.OnClickListener、View.OnFocusChangeListener
一、封裝findViewById()找到對應的View資源
二、封裝setListener()注冊監聽事件:長按事件、點擊事件、焦點改變事件。
三、實現對應的監聽接口,關鍵詞implements
四、重寫onClick()方法、onLongClick()方法、onFocusChange()方法和afterTextChanged()方法。
五、添加消息提示:Toast.makeText(this,"長按按鈕-點擊",Toast.LENGTH_SHORT).show();
-
新建Activity視圖為activity_item.xml,進行頁面布局並添加ListView
-
新建Activity的子類顯示activity_item資源,並在manifests里面注冊
-
新建ListAdpter繼承BaseAdapter,並覆寫主要的方法:getCount()和getView()
-
在ListAdpter添加List<String>對象,這是ListView的視圖來源,在覆寫getView()的方法時,使用LayoutInflater的inflater()方法將activity_item填充並可以設置TextView的文本。
@Override public View getView(int i, View view, ViewGroup viewGroup) { View view1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_item,viewGroup,false); TextView textView = view1.findViewById(R.id.text); textView.setText(mData.get(i)); return view1; }
線程安全機制:只有創建UI的線程能更改UI,並且UI線程不能進行耗時操作。
一、子線程進行耗時操作,操作完成后,使用Handler或Handler的子類的sendEmptyMessage()方法
private void download() { Runnable runnable = new Runnable() { @Override public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendEmptyMessage(1); } }; Thread thread = new Thread(runnable); thread.start(); }
二、主線程完成Handler的對象建立,並覆寫回調函數handleMessage()方法操作UI
mHandler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what == 1){ mBtDownload.setText(R.string.downloaded); } } };
一、獲取SharedPerferences和editor的對象並設置權限等級(私有權限:Context.MODE_PRIVATE)
sharedPreferences = getSharedPreferences("count", Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
二、向空間中添加鍵值對:
editor.putInt("count",count);
editor.apply();
三、取出空間中持久化的鍵值對:
count = sharedPreferences.getInt("count",0);
優點:簡單易用。
缺點:效率比較低,不能存儲大量數據和復雜數據結構。
一、輸入輸出流都是相對於內存來說的
-
-
寫入文件,是從內存到文件,則是出去,即FileOutputStream
-
讀取文件,是從文件到內容,則是進來,即FileInputSteam
-
二、Android文件的四種操作模式
FileOutputStream = openFileOutput(name,mode) 應用程序的數據文件夾下的文件對應的輸入流
name為文件名,mode為Android文件的四種操作模式之一:
-
-
Context.MODE_PRIVATE 默認操作模式,私有數據(只能應用本身訪問),寫入文件會被覆蓋
-
Context.MODE_APPEND 檢驗文件是否存在,存在就追加內容,不存在就先新建文件再添加內容
-
Context.WORLD_READABLE 可以被其他應用讀取
-
Context.WORLD_WRITABLE 可以被其他應用寫入
-
既可讀又可寫:Context.WORLD_READABLE + Context.WORLD_WRITABLE
-
三、寫入文件
-
-
獲取內存寫入輸出流fileOutputSteam,使用openFileOutput(fileName,mode)
-
字符串轉換為字節數組,注意編碼格式,默認getBytes()編碼為UTF-8
-
寫入,使用fileOutputSteam.write(),注意捕獲異常
-
private void writeFile() { FileOutputStream fileOutputStream = null; try { fileName = mEtName.getText().toString(); fileContext = mEtContent.getText().toString(); fileOutputStream = openFileOutput(fileName, MODE_APPEND); //1.獲取內存輸出流fileOutputSream fileOutputStream.write(fileContext.getBytes()); //2.字符串轉換為字節數組 Toast.makeText(this,"寫入完成!",Toast.LENGTH_SHORT).show(); } catch (java.io.IOException e) { e.printStackTrace(); Toast.makeText(this,"捕獲IO異常!",Toast.LENGTH_SHORT).show(); } finally { try { if (fileOutputStream!=null) fileOutputStream.close(); //無論捕獲異常還是正常執行,都需要關閉fileOutputStream } catch (IOException e) { e.printStackTrace(); } } }
四、讀取文件
將文件讀取到內存中,使用輸入流FileInputStream
-
-
獲取內存輸入流:使用openFileInput()方法
-
獲得字節數組:定義字節數組用於暫時保存數據,使用fileInputStream.read(bytes)方法獲取,返回值為字節數組的大小size。
-
獲得字符串:使用new String(bytes)的方法將字節數組轉換為字符串,注意編碼格式,默認編碼格式為UTF-8。 在使用中需要用完整填充的字節數組,所以這里還需要新定義一個剛好為size的字節數組用於正確地轉換為字符串。
-
private void readFile() { FileInputStream fileInputStream = null; try { fileName = mEtName.getText().toString(); fileInputStream = openFileInput(fileName); //1.獲取內存輸入流 byte[] bytes = new byte[1024]; int size = fileInputStream.read(bytes); //2.讀入字節數組 byte[] data = new byte[size]; System.arraycopy(bytes,0,data,0,size); //3.轉換為字符串,注意編碼格式 String str = new String(data); textView.setText(str); Toast.makeText(this,"讀取完成!",Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this,"文件沒有找到!",Toast.LENGTH_SHORT).show(); } finally { try { if (fileInputStream != null) fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
一、內部存儲(InternalStorage)與外部存儲(ExternalStorage)
-
-
內部存儲與外部存儲是相對於應用程序來說的,內部存儲是應用程序私有的,可設置對可外訪問。
-
內部存儲主要用於存儲應用的臨時數據,空間十分有限,應用卸載時,該目錄文件也被刪除。
-
二、內部存儲目錄:data/data/包名
內部存儲位置
|
存放數據類型
|
訪問方法
|
data/data/包名/shared_prefs
|
SharedPreferences將數據持久化到xml文件存放的目錄
|
|
data/data/包名/databases
|
數據庫文件存放的目錄
|
|
data/data/包名/files
|
普通數據存放的目錄
|
context.getFilesDir()
|
data/data/包名/cache
|
緩存文件存放的目錄
|
context.getCacheDir()
|
三、mnt或storage外部存儲
1.判斷外部存儲是否可用 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
外部存儲分類
|
外部存儲詳細目錄
|
使用方法
|
公共目錄
|
十大公共目錄
|
Environment.getExternalStorageDirectory().getPath()
|
私有目錄
|
storage/sbcard/Android/data/包名/files
|
getExternalFilesDir()
|
storage/sbcard/Android/data/包名/cache
|
getExternalCacheDir()
|
2.有包名的路徑都是調用Context中的方法獲取,沒有包名的路徑都是通過Environment中的方法獲取
四、補充
(1) 關於各種storage外部存儲的路徑:
其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一個路徑的不同“指針”,指向的是同一個地方,只是不同Android版本的叫法不一樣。如果大家想了解每個版本的外部存儲路徑,同學們可以通過獲取getExternalStorageDirectory方法的打印結果進行對比。
(2)清除緩存與清除數據
-
-
清除緩存:APP運行過程產生的臨時數據,為內部存儲文件。
-
清除數據:內部存儲/data/user/0/packname/和外部存儲/storage/emulated/0/Android/data/packname/下的文件里面的數據會全部刪除,包括cache,files,lib,shared_prefs等等。
-
(3)補充總結
-
-
/data目錄下的文件物理上存放在我們通常所說的內部存儲里面 ,一般用於臨時數據,比如頭像,密鑰文件(隱私,空間有限)。
-
/storage目錄下的文件物理上存放在我們通常所說的外部存儲里面 ,裁剪用於文件保存,上傳頭像(空間比較大)。
-
/system用於存放系統文件,/cache用於存放一些緩存文件,物理上它們也是存放在內部存儲里面的
-
描述
|
代碼
|
獲取內部存儲的根路徑
|
Environment.getDataDirectory() = /data
|
獲取外部存儲的根路徑
|
Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
|
系統的內部存儲
|
Environment.getDownloadCacheDirectory() = /cache
|
Environment.getRootDirectory() = /system
|
(4)友情鏈接:
-
-
徹底了解android中的內部存儲與外部存儲 https://www.cnblogs.com/jingmo0319/p/5586559.html
-
徹底搞懂Android文件存儲---內部存儲,外部存儲以及各種存儲路徑解惑 https://blog.csdn.net/u010937230/article/details/73303034/
-
Android存儲擴展學習-----應用的清除數據和清除緩存 https://blog.csdn.net/oudetu/article/details/78664514
-