邊做iOS邊學(xué)Android(三):Activity生命周期+通信

<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。


three_Log.jpeg

  • 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);
three_intent_put.png
* 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

three_on_activity_result.png

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è)頁面有一些成就感=筑悴。=

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稍途,隨后出現(xiàn)的幾起案子雷猪,更是在濱河造成了極大的恐慌,老刑警劉巖晰房,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件求摇,死亡現(xiàn)場(chǎng)離奇詭異射沟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)与境,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門验夯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摔刁,你說我怎么就攤上這事挥转。” “怎么了共屈?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵绑谣,是天一觀的道長。 經(jīng)常有香客問我拗引,道長借宵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任矾削,我火速辦了婚禮壤玫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哼凯。我一直安慰自己欲间,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布断部。 她就那樣靜靜地躺著猎贴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝴光。 梳的紋絲不亂的頭發(fā)上嘱能,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音虱疏,去河邊找鬼。 笑死苏携,一個(gè)胖子當(dāng)著我的面吹牛做瞪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播右冻,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼装蓬,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了纱扭?” 一聲冷哼從身側(cè)響起牍帚,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乳蛾,沒想到半個(gè)月后暗赶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鄙币,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蹂随,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十嘿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岳锁,死狀恐怖绩衷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情激率,我是刑警寧澤咳燕,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站乒躺,受9級(jí)特大地震影響招盲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聪蘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一宪肖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧健爬,春花似錦控乾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至设拟,卻和暖如春慨仿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纳胧。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工镰吆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跑慕。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓万皿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親核行。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牢硅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容