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

<a href="http://www.itdecent.cn/p/866e5b20c02d">邊做iOS邊學(xué)Android(一):新建一個(gè)project</a>
<a href="http://www.itdecent.cn/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,展開以后就是這樣。跑起來(lái),模擬器底下的back按鈕會(huì)銷毀當(dāng)前的Activity。


three_Log.jpeg

  • 2 接下來(lái)看一下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.itdecent.cn/p/94d806401ceb">第二回里面有說(shuō)咋加</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)建,顯式的簡(jiǎn)單些:
      • 3.2.1 喏,就是下面這樣,在按鈕的點(diǎn)擊里加上就可以跳過去了。之所以說(shuō)是顯式是因?yàn)槟繕?biāo)活動(dòng)很明顯擺在那了。
Intent intent = new Intent(當(dāng)前Activity.this, 目標(biāo)Activity.class);
startActivity(intent);
    * 3.2.2 隱式就麻煩一些,第一篇里邊說(shuō)過我們的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. 谷歌爹說(shuō)的)

<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","勞資傳過來(lái)的值");
* 3.4 在NormalActivity里(剛才有創(chuàng)見過TextView),顯示一下傳過來(lái)的值
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里傳過來(lái)的");
                  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>可以用來(lái)指定可以響應(yīng)的數(shù)據(jù)類型,例:

Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(“http://www.baidu.com”));
        startActivity(intent)

這是打開一個(gè)網(wǎng)頁(yè),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í)候再看。下一次就說(shuō)說(shuō)布局吧,畢竟先搭出來(lái)個(gè)頁(yè)面有一些成就感=。=

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容