<a href="http://www.reibang.com/p/866e5b20c02d">邊做iOS邊學(xué)Android(一):新建一個(gè)project</a>
<a href="http://www.reibang.com/p/94d806401ceb">邊做iOS邊學(xué)Android(二):認(rèn)識(shí)幾個(gè)常用的控件</a>
趁著不忙趕緊多寫點(diǎn),鬼知道后面又有什么需求要忙...
這次就看一下Activity的生命周期,以及不同Activity之間的通信吧。
開始:
- 1 新建一個(gè)項(xiàng)目瞒滴,ActivityLifeCyclePractice。然后在MainActivity里添加一些生命周期的方法米诉,Activity的生命周期方法有onCreate肛著、onStart、onRestart太闺、onResume糯景、onPause、onStop省骂、onDestroy蟀淮。
- 1.1 創(chuàng)建時(shí):onCreate(viewDidLoad)、onStart(viewWillAppear?)钞澳、onResume(viewDidAppear?)怠惶,在onResume時(shí)是前臺(tái)可交互狀態(tài)。
- 1.2 進(jìn)入后臺(tái)轧粟,調(diào)用onPause:Activity不在棧頂策治,但是棧頂?shù)腁ctivity半透明或者不覆蓋全屏;onStop:不在棧頂兰吟,被完全覆蓋通惫,成員信息保留,不執(zhí)行代碼揽祥。
- 1.3 從后臺(tái)進(jìn)入前臺(tái)讽膏,調(diào)用onRestart、onStart拄丰、onResume府树。
- 1.4 應(yīng)用銷毀,調(diào)用onPause料按、onStop奄侠、onDestroy。
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate");
}
@Override
protected void onRestart(){
super.onRestart();
Log.d(TAG,"onRestart");
}
@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");
}
Log.d就是打印debug級(jí)別的日志载矿,.d可以改垄潮,看日志等級(jí)了烹卒。2個(gè)參數(shù),第一個(gè)是篩選用的字符串弯洗,后面的就是打印的內(nèi)容旅急。在底部有個(gè)logcat,展開以后就是這樣牡整。跑起來藐吮,模擬器底下的back按鈕會(huì)銷毀當(dāng)前的Activity。
- 2 接下來看一下Activity之間的傳值
- 2.1 再創(chuàng)建一個(gè)NormalActivity逃贝,在layout下新建一個(gè)normal_layout谣辞,layout里新加一個(gè)TextView,代碼就不貼了沐扳。
- 2.2 在manifest里注冊(cè)這個(gè)Activity泥从,之前老忘。不用多想沪摄,跟main的Activity同級(jí)的啦(都是Activity嘛)躯嫉。
<activity android:name=".NormalActivity">
* 2.3 在NormalActivity的onCreate里添加setContentView(R.layout. normal_layout);
* 2.4 我們是從mainActivity跳到NormalActivity里,所以在main上加個(gè)按鈕(<a href="http://www.reibang.com/p/94d806401ceb">第二回里面有說咋加</a> )杨拐。點(diǎn)擊事件什么的也都寫好和敬,然后在點(diǎn)擊事件里:
- 3 使用Intent啟動(dòng)、傳值
- 3.1 Intent是一個(gè)好東西戏阅。它可以啟動(dòng)Activity,啟動(dòng)Service啤它,啟動(dòng)Broadcast奕筐。(中間一個(gè)不知道干嘛的,總會(huì)知道的变骡,第三個(gè)就是通知嘛...)
- 3.2 使用Intent啟動(dòng)Activity离赫,可以分為顯示跟隱式創(chuàng)建,顯式的簡單些:
- 3.2.1 喏塌碌,就是下面這樣渊胸,在按鈕的點(diǎn)擊里加上就可以跳過去了。之所以說是顯式是因?yàn)槟繕?biāo)活動(dòng)很明顯擺在那了台妆。
Intent intent = new Intent(當(dāng)前Activity.this, 目標(biāo)Activity.class);
startActivity(intent);
* 3.2.2 隱式就麻煩一些翎猛,第一篇里邊說過我們的main的Activity有個(gè)<intent-filter>,隱式創(chuàng)建也要用到這個(gè)接剩,就是在manifest里對(duì)應(yīng)的Activity標(biāo)簽內(nèi)部加一個(gè)篩選切厘。<intent-filter>里邊可以有3種標(biāo)簽<action>、<category>懊缺、<data>疫稿。
action只能有一個(gè),category可以有多個(gè)。action的name自己定遗座,category就是這個(gè)值了(沒深究舀凛,沒有category會(huì)??,Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters.
谷歌爹說的)
<activity android:name=".NormalActivity">
<intent-filter>
<action android:name="start_a_handsome_activity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
回到MainActivity里按鈕的點(diǎn)擊里把剛才顯示的換掉
Intent intent = new Intent("start_a_handsome_activity");
startActivity(intent);
* 3.3使用Intent傳值途蒋,傳個(gè)字符串過去猛遍,就是這樣
intent.putExtra("key","勞資傳過來的值");
* 3.4 在NormalActivity里(剛才有創(chuàng)見過TextView),顯示一下傳過來的值
Intent intent = getIntent();
String text = intent.getStringExtra("key");
TextView textView = (TextView) findViewById(R.id.normal_textView);
textView.setText(text);
* 3.5 在第二個(gè)活動(dòng)里把值傳回上一個(gè)(底下的back按鈕)碎绎,因?yàn)檫@個(gè)時(shí)候第二個(gè)會(huì)被銷毀螃壤,所以:
* 3.5.1 這個(gè)時(shí)候就不能用startActivity()方法啟動(dòng)活動(dòng)了,要用
startActivityForResult(intent,10086);
第一個(gè)是intent筋帖,第二個(gè)是requestCode奸晴,一個(gè)int值,唯一就行日麸。
然后在NormalActivity里加一個(gè)按鈕寄啼,里邊給intent賦值,然后調(diào)用setResult把intent傳回去代箭,有2個(gè)參數(shù)墩划,第一個(gè)是resultCode,一般就選2個(gè)值RESULT_OK或RESULT_CANCLED嗡综。然后調(diào)用finish()銷毀NormalActivity
Button btn = (Button) findViewById(R.id.destroy_button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
intent.putExtra("second","這是從Normal里傳過來的");
setResult(RESULT_OK,intent);
finish();
}
});
然后第一個(gè)MainActivity里會(huì)走回調(diào)
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data){
switch (requestCode){
case 10086:
if (resultCode == RESULT_OK){
String text = data.getStringExtra("second");
Toast.makeText(MainActivity.this,text,Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
不寫在onDestory里是因?yàn)榈谝粋€(gè)Activity的回調(diào)先走乙帮,再走onDestory,這樣resultCode就一直是RESULT_CANCLED
intent作為初學(xué)者還是得好好看看极景,
<intent-filter>里的<data>可以用來指定可以響應(yīng)的數(shù)據(jù)類型察净,例:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(“http://www.baidu.com”));
startActivity(intent)
這是打開一個(gè)網(wǎng)頁,Intent.ACTION_VIEW是系統(tǒng)內(nèi)置的盼樟,setData方法傳一個(gè)Uri對(duì)象氢卡,<data>標(biāo)簽可以篩選:
android: scheme(http部分)/host(www.baidu.com部分)/port/path/mimeType。
我知道的Intent也就這么點(diǎn)晨缴。一下子全看了也記不了译秦,倒不如用到的時(shí)候再看。下一次就說說布局吧击碗,畢竟先搭出來個(gè)頁面有一些成就感=筑悴。=