安卓學習日記——Activity(一)
四大核心組件——Activity
簡介:一個Activity代表一個界面,即一個活動。活動開始,則Activity組件啟動,活動結束,則代表一個Activity組件生命周期結束
- 內部概念
1)Application
2)Activity
3)Activity棧
4)task
一整個應用就是一個Application,即平時說的APP
圖解
其中123代表的是一個個Activity,3表示是另一個APP里的Activity,Activity都存放在Activity棧里,先進后出。兩個APP進行切換,就形成了任務之間的關系。
- Activity狀態
1)Resumed 一個新Activity啟動入棧后,它在屏幕最前端,處于棧的最頂端,此時它處于可見并可交互的**狀態。
2)Paused當Activity被另一個透明或者Dialog樣式的Activity覆蓋時的狀態。此時它依然與窗口管理器保持連接,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與用戶交互。
3)Stoped 當Activity被另外一個Activity覆蓋、失去焦點并不可見時處于Stoped狀態。 - Activity生命周期
七大方法
public class MyActivity extends Activity{
//Activity創建時被調用
protected void onCreate(Bundle savedlnstanceState);
//Activity可見時被調用
protected void onStart();
//Activity重新可見時被調用,接著會調用onStart()
protected void onRestart();
//Activity獲得焦點,可進行輸入時被調用
protected void onResume();
//Activity失去焦點,但可見時被調用(在其它應用需要內存時,可能會被kills)
protected void onPause();
//Activity完全不可見時被調用(會被系統kills)
protected void onStop();
//Activity被銷毀時被調用(會被系統kills)
protected void onDestroy();
}
圖解
運行過程示例
應用啟動后
點擊home點后
重新點擊應用
關閉應用
- 七大方法詳解
onCreate:Activity創建時第一個調用的方法,通常我們在該方法中加載布局文件,初始化UI組件,事件注冊等等
onStart:在onCreate方法之后調用,用于顯示界面,但用戶還不能進行交互
onRestart:當一個stoped狀態的Activity被返回時調用,之后再調用onStart進入運行狀態
onResume:在onStart之后調用,該方法執行完成后,用戶可以進行交互,當前Activity進入resumed狀態。當一個paused狀態的activity被重新返回時,會再次調用該方法,讓Activity進入運行狀態
onPause:當其它Activity(透明或窗口模式)進入時,該方法會被調用,讓當前Activity進入paused狀態(暫停狀態)。當前Activity還可見但不可交互,如果其它更高優先級的APP需要內存時,當前Activity可能會被銷毀(kill)。當前Activity被返回時會調用onResume方法
onStop:當其它Activity覆蓋該Activity時,會被調用,當前Activity進入stoped狀態(停止狀態)。不可見,如果其它更高優先級的APP需要內存時,當前Activity可能會被銷毀(kill)。 當前Activity被返回時會調用onRestart方法
onDestroy:當前Activity被銷毀時調用,通常在該方法中用來釋放資源,當前Activity killed
- Activity傳遞數據
方法一:
intent與Bundle使用
關鍵代碼塊
/**
* 啟動ActivityB,并且傳遞數據
* @param v
*/
public void sendClick(View v){
//創建一個意圖(想干什么)參數(上下文,要跳轉的組件的字節碼)
Intent intent=new Intent(this,MainActivityB.class);
String info=editText_info.getText().toString();
//封裝要傳遞的數據
Bundle data=new Bundle();
data.putString("info",info);
intent.putExtra("data",data);
startActivity(intent);
}
MainActivityB 接受傳遞過來的數據并顯示
private TextView textView_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_b);
textView_info=findViewById(R.id.info);
Intent intent=getIntent();
Bundle data=intent.getBundleExtra("data");
String info=data.getString("info");
textView_info.setText(info);
}
方法二:
使用Intent直接傳遞數據
public void sendClick(View v){
//創建一個意圖(想干什么)參數(上下文,要跳轉的組件的字節碼)
Intent intent=new Intent(this,MainActivityB.class);
String info=editText_info.getText().toString();
intent.putExtra("info",info);
startActivity(intent);
}
接收數據代碼
private TextView textView_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_b);
textView_info=findViewById(R.id.info);
Intent intent=getIntent();
String info=intent.getStringExtra("info");
textView_info.setText(info);
}
效果圖
- 傳遞對象
方法一
使用Serializable序列化方式傳遞對象。(消耗性能和資源較大)
新建一個類,確定要傳遞的對象的屬性
public class Cat implements Serializable {
String name;
int age;
String type;
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
}
傳遞對象
public void sendObjClick(View v){
//要傳遞的對象
Cat cat=new Cat();
cat.name="皮卡丘";
cat.age=2;
cat.type="無上傳說";
Intent intent=new Intent(this,MainActivityB.class);
intent.putExtra("cat",cat);
startActivity(intent);
}
接收對象
Cat cat= (Cat) intent.getSerializableExtra("cat");
textView_info.setText(cat.toString());
方法二
使用Parcelable序列化方式傳遞對象。(性能比較高,使用系統自帶的打包方式傳遞數據)
創建一個類用于確定對象的屬性
import android.os.Parcel;
import android.os.Parcelable;
public class Dog implements Parcelable {
String name;
int age;
String type;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(type);
}
//對象的創建器
public static final Parcelable.Creator<Dog>CREATOR
=new Parcelable.Creator<Dog>(){
public Dog createFromParcel(Parcel in){
Dog dog=new Dog();
dog.name=in.readString();
dog.age=in.readInt();
dog.type=in.readString();
return dog;
}
public Dog[] newArray(int size){
return new Dog[size];
}
};
}
傳遞數據
public void sendObj2Click(View v){
Dog dog=new Dog();
dog.name="哮天犬";
dog.age=1;
dog.type="看門犬";
Intent intent=new Intent(this,MainActivityB.class);
intent.putExtra("dog",dog);
startActivity(intent);
}
接收對象
Dog dog=intent.getParcelableExtra("dog");
textView_info.setText(dog.toString());
兩種方法的區別在于類的繼承不同,Serializable采用的是Java的IO方式傳遞數據,Parcelable則是as自帶的,相較于前者,后者的性能方面會比較高,但是代碼相對復雜。
智能推薦
安卓ApiDemos學習 app/Activity/SetWallpaper
墻紙設置的例子,還涉及一些圖片變換的內容 取得當前墻紙 將墻紙設置到imageview上 因為要對圖片進行一些處理,所以打開了catch imageView.setDrawingCacheEnabled(true) 點擊Randomize按鈕時,會隨機生成一個數字,然后從預定義的數據中取出顏色 然后將顏色覆蓋在圖片上,只允許某些顏色通過。 mColors是一個數據,預先定義了一些顏色 用戶點擊 S...
安卓學習日記——畫布與繪制
先提一下Draw 9-patch 老版本的Android Studio是在SDK目錄下的Tools里有個draw9patch 新版Android Studio是可以在AS里直接創建的(一開始沒在目錄下找到我也是一臉懵逼) 與傳統的png格式圖片相比,9.png格式圖片在圖片四周有一圈一個像素點組成的邊沿,該邊沿用于對圖片的可擴展區和內容顯示區進行定義。這種格式的圖片在android環境下具有自適應...
安卓學習日記——Vitamio框架
Vitamio中文名稱“維他蜜”,是一款Android與IOS平臺上的全能多媒體開發框架,全面支持硬件解碼與GPU渲染。Vitamio能夠流程播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常見格式的視頻,還可以在Android與IOS上跨平臺支持MMS,RTSP,RTMP,HLS等常見的多種視頻流媒體協議,包括點播與直播。 下載地址:http...
安卓學習日記——NDK開發
NDK下載地址:https://developer.android.google.cn/ndk/downloads/index.html 解壓完之后配置Path activity_main.xml MainActivity com_example_ndk_MainActivity.h hello.c Android.mk 效果...
安卓學習日記——圖片緩存組件
第三方庫 Universal-Image-Loader 框架的特點 1.多線程下載圖片,圖片可以來源于網絡,文件系統,項目文件夾assets中以及drawable中 2.支持隨意的配置ImageLoader,例如線程池,圖片下載器,內存緩存策略,硬盤緩存策略 圖片顯示選項以及其他的一些配置 3.支持圖片的內存緩存,文件系統緩存或者SD卡緩存 4.支持圖片下載過程的監聽 5.根據控件(lmageVi...
猜你喜歡
安卓_Activity
安卓入門 創建你的第一個工程 Layout Name 需要小寫,下面的Backwards Compatibility勾選后可支持低版本安卓系統 左上角可自由選擇工程顯示方式如project、Android,根據自己喜好選擇。 下面就是我們默認創建的Activity中的Java代碼,在路徑中可以找到(MainActivity) 點擊右下角Emulator按鈕整一個界面模擬器,可以看見我們的MainA...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...