在此之前還是補充下關於監聽器的兩個要點:
向下一個活動傳遞數據 :
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra1", data);
startActivity(intent);
}
});
putExtra就是傳遞數據的方法,參數一就是一個鍵,接收端只有用這個鍵才能接受,data就是接受的數據。
在第二個活動這接收:
Intent intent=getIntent();
String data=intent.getStringExtra("extra1");
Log.d("this",data);
其實這很像Map的鍵值對put和get嘛,這邊調用,就把data獲取過來了,然后就用這邊的data接受,輸出
返回數據給上一個活動 :
這是第二個活動里的,第一個活動可以跳轉到第二個,
Button bt2=findViewById(R.id.button2);
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("data_return","there has nothing!!!");
setResult(RESULT_OK,intent);
finish();
}
});
setResult主要是為了給下面重寫的那個onActivityResult方法准備的,
然后把數據返回給第一個活動:
第一個活動就是先寫監聽器:
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivityForResult(intent,2);
}
});
這邊第一個活動,就是監聽的時候注意用startActivityForResult,才能傳值,那個2,其實也是給重寫的方法准備的onActivityResult
這個重寫的方法,可以看出它的三個參數,首先就是startActivityForResult里的那個數字,然后就是第二個活動里的setResult那個常量RESULT_OK,最后一個就是Intent的數據,就是意圖
聯系起來
startActivityForResult(intent,2);以及setResult(RESULT_OK,intent);都是為onActivityResult做准備的
然后再重寫下
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 2:
if (resultCode == RESULT_OK)
{
String returnedData = data.getStringExtra("data_return");
// Log.d("FirstActivity", returnedData);
Log.d("MainActivity",returnedData);
}
break;
default:break;
}
}
這是接收數據的,很長。
接下來正式進入生命周期的學習,智商不合格的本牛崽在這徘徊了良久。
因為每個窗口的打開都相當於放進了棧里,棧是先進后出的。
打個比方,頁面1,2,3分別打開。
1在棧底,它最先打開,當2,3沒打開時,它是不是在棧頂,就是可以操作的界面,然后2,3來了,
它就被壓下去了,這個時候3是棧頂,如果3出棧,那么棧頂就是2,以此類推,最后棧頂是1,然后空棧結束。
(如果還不清楚,可以用一個軟件來測試,應該很快就可以看出其中的規律了)
各個活動之間的關系就存在返回棧(task)
活動狀態 :
分別是運行狀態,暫停狀態,停止狀態,銷毀狀態。
運行狀態就是task棧頂的時候(用戶當前看到的界面),此時它是活動的,如果你突然給它來個閃退,也就是銷毀狀態,你會不會暴走?
如果給你來個暫停狀態(網絡不行了),你會不會咬牙切齒
停止狀態大概就是掛后台吧(個人見解,有不同意見可以評論,直接糾正我,萬一誤人子弟就不好了)
活動的生存期
七個,
我們新手一般只見過onCreate吧。
下面的就是活動的生命周期
其實我們一般只重寫了onCreate,其他的都沒重寫,但是一些功能還是運行了的,
下面的是體現生命周期的代碼:
思路就是兩個按鈕跳轉到不同的頁面,跳轉前后生命周期的變化。
跳轉的話你們自己實現吧
其中TAG是Log.d里的目標,因為直接在主活動寫的,就定義了常量TAG
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"onRestart");
}
活動被回收了怎么辦 :
我們為啥要考慮活動被回收的問題?
因為如果我們在登錄用戶,突然就被回收了,那我們的數據就都消失了,又得重新輸入用戶名和密碼,導致用戶體驗不舒適。
所以我們得重寫一個方法onSaveInstanceState。
這就是本牛崽遇到的頭疼的問題,網上搜了好一會都沒找到,后面才知道是模擬器不行,之后就傻乎乎的用手機測試了,才成功。
這個方法是需要觸發才能運行的,本牛崽就一直在折騰這個觸發,
先上代碼:
重寫方法:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("data_key","Something you just typed");
}
有點像Intent意圖的值的傳遞,這就是個鍵值對。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate");
setContentView(R.layout.activity_main);
if(savedInstanceState !=null){
String data=savedInstanceState.getString("data_key");
Log.d(TAG,data);
System.out.println(data);
}
}
剛開始,這個onCreate是我給的Log.d,
顫抖的手啊
手機端調試才能成功輸出了我的那句Something you just typed,我的難題就這樣解決的。可笑不?
然后在創建時,也就是登錄用戶時,如果突然回收,我們可以把當時存下的數據放回去。
如果實在不懂這個是啥的,建議去搜搜onSaveInstanceState。
https://www.jianshu.com/p/27181e2e32d2,這個大牛寫的很詳細,就連它兄弟都介紹了。
再一筆帶過這個活動的啟動模式
https://www.jianshu.com/p/b4472dc6911e奉上大牛的神筆。
基本上是理論,就不上操作的圖了