第二章 Activity
1.Android Activity 生命週期
什麼是Activity?
- 從視覺效果來看:是一個活動窗口,是應用程序繪製的一個圖形界面,用於響應本窗口中的所有的事件--》JSP/HTML
- 從應用程序來看,一個Activity就是一個單獨的屏幕,相當於是安卓程序和用戶交互的一個橋樑.-->XML+JAVA--->html/jsp+JS
- 從外部看,Activity 就是一個圖形界面,通俗點說就是在android 的應用中所看到的用戶界面都是一個Activity或者說是Activity的表現
- 從內部來看,Activity就是view 的容器,負責把放在其中的組件按照一定的組織進行表現和處理。 對於程序員來說,Activity就是一個java類一個入口,我們在裏面編寫相關的實現代碼 XML+JAVA
Activity的狀態
- 1.running:激活狀態
- *Activity在屏幕顯示
- *可以進行交互
- 2.Paused:暫停狀態
- *Activity不能進行交互,暫時把屏幕顯示給其他的Activity
- *例如:手機鎖屏了,這個Activity就被暫停了
- 3.Stop:停止狀態
- *進入後臺不運行
- *例如:按了home鍵,應用進入了後臺不運行
- 4.Destory:銷燬狀態
- *應用被殺死了
- *情況:用戶殺掉;Android系統自動殺死(設計到了進程的優先級問題);
官方解釋:
①Running:活躍的狀態,即在onResume()以後Activity處於前臺可視化,整個Activity最頂層的狀態,可以和用戶直接進行交流;
②Pause:暫停的狀態,當一個Activity被另一個新的非全屏的或者透明的Activity覆蓋時候,此時該Activity是去焦點,暫時失去了和用戶交流的能力,但是其狀態、變量等都還保留着。
③Stop:結束的狀態,當一個Activity被另一個全屏的非透明Activity完全覆蓋時候的狀態,此時該Activity已經不可見了,但是狀態還保留着。
④Destoryed:銷燬的狀態,當一個Activity被系統回收或者人爲關閉後的狀態,此時Activity已經關閉。
Android:XML+JAVA 類似於web開發裏面:HTML+JS
Activity的狀態的轉換
2.Android Log使用
log是什麼?
進行日誌處理的一個專門的類,日誌的處理便於開發者調試和維護。
在程序中輸出日誌, 使用 android.util.Log 類.
該類提供了若干靜態方法
- android.util.Log
- 1.Log.v(String tag, String msg); 黑色 任意的信息都會輸出
- 2.Log.d(String tag, String msg); dubug 斷點
- 3.Log.i(String tag, String msg); 綠色 提示信息
- 4.Log.w(String tag, String msg); 橙色 警告信息
- 5.Log.e(String tag, String msg); 紅色 錯誤信息
分別對應 Verbose(冗長), Debug, Info, Warning,Error.
tag是一個標識,可以是任意字符串,通常可以使用類名+方法名, 主要是用來在查看日誌時提供一個篩選條件.
在MainActivity.java文件中寫入onStart(),onResume(),onStop()方法,並且寫一段
Log.v(“mainActivity”, “執行onResume方法”);
代碼,這個時候可以在logcat框中看到日誌記錄.如果太多了日誌記錄,可以創建一個過濾器,過濾器的包名應該與應用的包名一致.
3.Android EditText常規操作
1)EditText,TextView,Button之間的關係
EditText輸入框,TextView文本信息,Button按鈕
2)EditText的相關屬性
activity的屬性在activity_mian.aml文件中設置,Outline面板中可以設置屬性
TextView的基本屬性:有Id,Layout Parameters,Text,Hint,Input Type,Content Description,TextView(因爲EditText繼承了TextView),View(View),Deprecated.子類繼承父類的屬性,+特殊的屬性.
Id是命名,注意不能有重複
Layout Parameter(佈局)中,的width和height有wrap_content(跟內容相同,內容有多大就有多大),fill_parent(填充內容),match_parent(跟父屬性相同)三個屬性.
Text是內容.
Hint是提示信息.
Input Type是輸入內容的值的類型,即輸入框中彈出的鍵盤類型.
- *自己的屬性
- *繼承來的
- *layout parameter
- *Drepcate--廢棄的屬性
- 4大部分屬性:
4)常用操作:
- 獲取對象
- 設置值
- 獲取值
在MainActivit.java文件的onstart()方法中編寫以下代碼,獲取對象,設置值,獲取值:
// 獲取對象 // 所有開發的組件的id,都是在R類裏面 // R.id.xxx EditText username = (EditText) findViewById(R.id.main_username); EditText password = (EditText) findViewById(R.id.main_password); // 設置值 username.setText("用戶名"); password.setText("123456"); // 獲取值 String passwordStr = password.getText().toString(); String usernameStr = username.getText().toString(); Log.v("mainActivity", "passwordStr的值爲" + passwordStr + "usernameStr的值爲:" + usernameStr);
則在應用的編輯欄中會顯示我在代碼中編寫password和username,在日誌文件中也會顯示
4.Android點擊事件實現的邏輯
三種方式:
1)在屬性裏面直接配置onclick屬性-指定方法
給登入按鈕綁定了Login的方法,然後再在MainActivity.java中創建一個login方法
login方法:
/*
1.把方法的修飾改成public
2.方法的參數一定要放一個View對象
*/
public void login(View v) {
// 獲取對象
// 所有開發的組件的id,都是在R類裏面
// R.id.xxx
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
// 設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
}
2)給按鈕綁定事件
在onCreate方法中給按鈕loginB綁定一個View.onClickListener的匿名內部類,並且創建一個onClick()方法.
// 所有Activity第一個執行的方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 寫一段日誌執行
Log.v(“mainActivity”, “執行oncreate方法”);
Button loginB = (Button) findViewById(R.id.button);
// 給按鈕綁定一個點擊事件
loginB.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
// R.id.xxx
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
// 設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
}
});}
3)activity實現事件的接口
第一步:實現OnClickListener接口,就會產生一個onclick()方法
public class MainActivity extends Activity implements OnClickListener
第二步:在oncreate中爲按鈕綁定鼠標點擊事件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 寫一段日誌執行
Log.v(“mainActivity”, “執行oncreate方法”);
//獲取button按鈕控件
Button loginButton = (Button) findViewById(R.id.button);
//爲按鈕綁定一個點擊事件
loginButton.setOnClickListener(MainActivity.this);
}
第三步:編寫onclick方法,如果鼠標點擊了按鈕,則會執行onclick中的方法
@Override public void onClick(View v) { }
但是實現了一個OnclickListener接口,只會生成一個onclick方法,如果有多個button按鈕的時候怎麼辦呢?
如果有多個按鈕需要綁定事件的時候,根據按鈕的id識別是哪個按鈕,然後再給他綁定相應的事件
代碼如下:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
Log.v(“mainActivity”,“進入監聽事件-自己”);
//獲取編輯框
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
//給編輯框設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
break;
default:
break;
}
5.Android 傳值方式
登入界面–>點擊登入按鈕–>跳轉到主頁面,在主頁面顯示用戶名,密碼.
步驟:
1.登入界面–已經有了
2.主頁面
3.登錄頁面點擊的時候,獲取輸入的用戶名,密碼,傳值給主頁面
4.主頁面獲取登入頁面傳入的值.
開發主頁面步驟:
1)創建一個activity.mxl
設置activity名字,首字母必須大寫
2)設置home頁面的相關屬性
傳值方式有以下四種:
(1)intent傳值
使用intent傳值在傳遞方一共要3步
- 創建意圖
- 向意圖中存入要傳遞的值
- 啓動意圖
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
Log.v(“mainActivity”,“進入監聽事件-自己”);
//獲取編輯框
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
//給編輯框設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
//使用Intent傳遞值
//1.創建一個Intent,要指定class,第一個是我當前的位置,第二個是我要跳轉的位置.
Intent intent=new Intent(MainActivity.this,HomeActivity.class);
//2.存儲值進intent
intent.putExtra(“username”, usernameStr);
intent.putExtra(“password”, passwordStr);
//3.啓動意圖
startActivity(intent); break;
default:
break;
}}
接收方需要4步:
- 創建意圖,並獲取意圖
- 獲取意圖中的值
- 獲取控件
- 給控件設置你需要的值
在HomeActivity的onCreate中寫以下代碼:
//1.創建意圖,並且獲取意圖
Intent intent=getIntent();
//2.獲取意圖中的值
String username=intent.getStringExtra(“username”);
String password=intent.getStringExtra(“password”);
//3.獲取Home界面中的TextView控件
TextView name=(TextView) findViewById(R.id.home_username);
TextView pass=(TextView) findViewById(R.id.home_password);
//4.將獲取的值設置給TextView控件
name.setText(username);
pass.setText(password);
運行項目
(2)bundle傳值
bundel其實就是基於意圖的,使用bundle的方法就是將數據放到bundle中,然後再將bundle放到intent中
基本思路
MainActivity其他代碼不變,onClick(v)修改後代碼如下:
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//如果點擊的按鈕的id爲button,則執行以下事件
Log.v(“mainActivity”, “進入監聽事件-自己”);
// 獲取編輯框
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
// 給編輯框設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
// 使用bundle傳遞值
// 1.創建一個Intent,要指定class,第一個是我當前的位置,第二個是我要跳轉的位置.
Intent intent = new Intent(MainActivity.this, HomeActivity.class); //2.創建一個bundle
Bundle bundle=new Bundle();
//3.將所有的信息放到bundle中
bundle.putString(“username”, usernameStr);
bundle.putString(“password”, passwordStr);
//4.bundle是基於意圖的,將bundle放到意圖中
intent.putExtras(bundle);
//5.啓動意圖
startActivity(intent); break;
default:
break;
}}
HomeActivity中其他的代碼,onCreate方法中將之前用intent獲取值改爲用bundle獲取值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//1.創建意圖,並且獲取意圖
Intent intent=getIntent();
//2.獲取bundle對象
Bundle Extras=intent.getExtras();
//3.獲取意圖中的值
String username=Extras.getString(“username”);
String password=Extras.getString(“password”);
//3.獲取Home界面中的TextView對象
TextView name=(TextView) findViewById(R.id.home_username);
TextView pass=(TextView) findViewById(R.id.home_password);
//4.將獲取的值設置給TextView控件
name.setText(username);
pass.setText(password);}
運行結果一致!
(3)application傳值
**含義:**應用.
在web開發中把信息放到Application中,就是全局都可以獲取值.
**原理:**Activity向application裏面放入值.其他的任意的activity都可以獲取當前的application,從application裏面就可以取到放在裏面值.
應用場景:
1)相同的數據,很多的activity需要
2)一個數據需要從一個activity傳到另外一個,另外一個傳給第二個.
開發步驟:
第一步 :建立MyApplication 類 繼承Application ,建立私有屬性,建立getter setter 方法,*在清單文件中進行註冊,在Application標籤對中添加name屬性,屬性值爲 創建Application的包名加類名。*
1)創建Application類:
2)建立私有屬性:
public class MyApplication extends Application {
//用戶名
private String username;
//密碼
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3)在清單文件中註冊:
**第二步:**MyApplication application= (MyApplication) getApplication(); //在主頁面中接收application,對application的屬性進行賦值。 application.setNum1();
在MainActivity中的onclick方法中,將信息存入Application中
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//如果點擊的按鈕的id爲button,則執行以下事件
Log.v(“mainActivity”, “進入監聽事件-自己”);
// 獲取編輯框
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
// 給編輯框設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
//1.創建一個Intent,要指定class,第一個是我當前的位置,第二個是我要跳轉的位置.
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
//2.創建一個Application對象
MyApplication myApplication=(MyApplication) getApplication();
//3.將信息存入Application中
myApplication.setUsername(usernameStr);
myApplication.setPassword(passwordStr);
break;
default:
break;
}
}
**第三步:**在onclick方法中創建意圖對象Intent ,啓動意圖對象所對應的頁面
Intent intent=new Intent(MainActivity.this,ResultActivity.class);
startActivity(intent);
第四步: 在接收頁面獲取application對象 然後取值之後展示到在相應的顯示控件當中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//1.創建意圖,並且獲取意圖
Intent intent=getIntent();
//2.獲取意圖中的值
//String username=intent.getStringExtra(“username”);
//String password=intent.getStringExtra(“password”);//獲取當前的應用
MyApplication myApplication=(MyApplication) getApplication();
//獲取Application中的值
String username=myApplication.getUsername();
String password=myApplication.getPassword();
//3.獲取Home界面中的TextView對象
TextView name=(TextView) findViewById(R.id.home_username);
TextView pass=(TextView) findViewById(R.id.home_password);
//4.將獲取的值設置給TextView控件
name.setText(username);
pass.setText(password);}
運行結果與意圖傳值一致!
(4)數據回傳
數據回傳邏輯:
代碼:
在MainActivity中的onclick中寫入以下代碼:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//如果點擊的按鈕的id爲button,則執行以下事件
Log.v(“mainActivity”, “進入監聽事件-自己”);
// 獲取編輯框
EditText username = (EditText) findViewById(R.id.main_username);
EditText password = (EditText) findViewById(R.id.main_password);
// 給編輯框設置值
username.setText(“用戶名”);
password.setText(“123456”);
// 獲取值
String passwordStr = password.getText().toString();
String usernameStr = username.getText().toString();
// 使用Intent傳遞值
// 1.創建一個Intent,要指定class,第一個是我當前的位置,第二個是我要跳轉的位置.
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
//5.啓動意圖
//startActivity(intent);
/* requestCode:類型Int*/
startActivityForResult(intent, 1);break;
default:
break;
}}
然後再在裏面寫入一個onActivityResult()方法獲取回傳的數據:
/*activity傳值回調方法
1.取activity返回的數據
2.取值之前要判斷一下請求碼和結果碼
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(“mainActivity_onActivityResult”,“進入回調方法”);
super.onActivityResult(requestCode, resultCode, data);
if(requestCode1&&resultCode2) {
String returnData=data.getStringExtra(“returnData”);
Log.d(“mainActivity_onActivityResult”,returnData);
Log.v(“mainActivity”, returnData);
}
}
在homeActivity中的onCreate方法中寫一個鼠標點擊事件用於返回數據:
/*給按鈕添加事件
方式2:直接給按鈕對象綁定事件監聽器
獲取按鈕對象
綁定監聽器
/
//獲取對象
Button button=(Button) findViewById(R.id.home_button);
/ 綁定監聽事件 /
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/ 返回數據給MainActivity /
//獲取意圖
Intent intent2=getIntent();
//放返回數據
intent2.putExtra(“returnData”, “這是我回傳的數據”);
/ resultCode:是開發人員自己定義的intent返回標識碼數據類型:int*/
setResult(2,intent2);
HomeActivity.this.finish();
}
});
最終頁面就會跳轉到Mainactivity頁面,並獲取數據
g.v(“mainActivity”, returnData);
}
}
在homeActivity中的onCreate方法中寫一個鼠標點擊事件用於返回數據:
/*給按鈕添加事件
方式2:直接給按鈕對象綁定事件監聽器
獲取按鈕對象
綁定監聽器
/
//獲取對象
Button button=(Button) findViewById(R.id.home_button);
/ 綁定監聽事件 /
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/ 返回數據給MainActivity /
//獲取意圖
Intent intent2=getIntent();
//放返回數據
intent2.putExtra(“returnData”, “這是我回傳的數據”);
/ resultCode:是開發人員自己定義的intent返回標識碼數據類型:int*/
setResult(2,intent2);
HomeActivity.this.finish();
}
});
最終頁面就會跳轉到Mainactivity頁面,並獲取數據
這就是Android第二章的課程筆記,如果你覺得寫的不錯記得關注我哦!你們的支持就是我不斷創作的源泉