天天看點

第一行代碼 第二章 Activity

一、Activity基本概念

Activity 主要用于和使用者進行互動。

所有的Activity都需要在Androidmanifest.xml檔案中注冊才能生效。通過activity标簽對活動進行注冊

Androidmanifest.xml檔案内容:
<activity android:name=".MainActivity">
<!--  android:name 用來指定具體注冊的是哪個活動 
    .MainActivity 是隐藏包名的縮寫
-->
<!-- 
    intent-filter 這樣配置表示這個活動是**主活動**
-->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
           

二、Activity的啟動方式

顯示Intent啟動和隐式Intent啟動

Intent:是Android程式中各個元件之間互動的一種方式;通過它可以實作各元件之間的資料傳遞,還可以指明目前元件想要執行的動作。

Intent(Context packageContext, Class<?> cls);

第一個參數,要求提供一個啟動活動的上下文;

第二個參數,指定想要啟動的目标活動

startActivity(),是專門用于啟動活動的方法,它接收一個intent參數。

将建構好的Intent傳人startActivity()方法就可以啟動目标活動了。

1、顯示啟動

button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
    Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();

/*
    顯式Intent 啟動目标活動
    表示在MainActivity這個活動中去啟動SecodeActivity這個活動
*/
    Intent mIntent = new Intent(MainActivity.this,SecodeActivity.class);
    startActivity(mIntent);
    }
});
           

擴充小知識

Activity繼承于Context。

this:表示目前對象。哪個類調用就是指向該對象。

類名.this(MainActivity.this):表示這個類對象(MainActivity對象)。當在内部類的方法中需要引用外部類時,就要用到這種寫法;如果在内部類中直接使用this,則表示内部類本身。

MainActivity是一個外部類,View.OnClickListener是一個内部類,在内部類中使用外部類方法需要使用外部類名.this引用外部類的執行個體。

類名.class:傳回的是這個類的Class對象

擷取Class對象的方式通常有三種:

1、通過類名.class擷取 ;

2、通過已經執行個體化的對象擷取,getClass()方法擷取;

3、通過Class.forName(“類的全名稱”)擷取,這種方法比較少見。

2、隐式啟動

此方式并不明确的指出我們想要啟動的活動,而是通過指定action和category等資訊,交由系統分析這個Intent,從中選出最合适的活動去啟動。

由于這種方式是交由系統來決定的,是以隻要在系統中比對到就可以啟動該活動,故此方式可以啟動第三方應用,也可以啟動系統内置應用。

當系統比對到多個應用時,會彈出選擇提示框,用于使用者選擇啟動哪個應用。

在Androidmanifest.xml檔案中,通過activity标簽下配置intent-filter标簽的内容,就可以指定目前活動的action和category。

<activity android:name=".SecodeActivity">
    <intent-filter>
        <action android:name="com.sky.activitytest.SECODE_ACTIVITY_ACTION"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <category android:name="com.sky.activitytest.SECODE_ACTIVITY_CATRGORY"></category>
    </intent-filter>
</activity>

/*
    這裡定義了可以響應SecodeActivity的action(com.sky.activitytest.SECODE_ACTIVITY_ACTION)和category(com.sky.activitytest.SECODE_ACTIVITY_CATRGORY)配置資訊。

*/
           
/*
    隻有當Intent中指定的action和category同時能夠比對Androidmanifest.xml中的action和category,這個活動才能響應。
    android.intent.category.DEFAULT是一隻預設的category,在調用startActivity()方法時會自動将這個category添加到Intent中。

*/

**每個Intent隻能指定一個action,可以指定多個category**

// 隐式Intent 啟動活動
Intent mIntent = new Intent("com.sky.activitytest.SECODE_ACTIVITY_ACTION");
mIntent.addCategory("com.sky.activitytest.SECODE_ACTIVITY_CATRGORY");
startActivity(mIntent);
           

三、activity之間傳遞資料 – Intent

http://blog.csdn.net/good__man/article/details/63812419

此連結有詳細說明 《關于Activity之間傳遞資料的6種方式》

1、使用Inten的putExtra傳遞

2、使用Activity銷毀時傳遞資料

3、使用SharedPreferences傳遞資料

4、使用靜态變量傳遞資料

5、使用序列化對象Seriazable

1、向下一個活動傳遞資料:

使用intent.putExtra()方法來傳遞資料;該方法有兩個接收參數:

第一個參數是鍵,用于啟動的活動從這個鍵中取得值;

第二個參數是傳遞的資料。

intent傳遞的資料除了可以是整型、布爾型、字元串;還可以是bundle、自定義的對象(該對象需要通過serializable或者parcelable方式進行序列化)。
firstActivity代碼片段:

button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
        Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);
        // 從firstActivity将資料(1111111)傳遞給SecodeActivity
        mIntent.putExtra("data", "1111111");
        startActivity(mIntent);
    }
});
           
SecodeActivity代碼片段:

    Intent intent = getIntent();
    // getData 就是從firstActivity傳來的資料(1111111)
    String getData = intent.getStringExtra("data");
           

除了getStringExtra,還可以使用getIntExtra()、getBooleanExtra()、getSerializableExtra()、getBundleExtra()、getSharedPreferences()來擷取資料;這主要是看從firstActivity中傳遞什麼類型的資料來選擇的。

2、傳回資料給上一個活動:

要想實作這樣的效果,需要在firstActivity中使用startActivityForResult()方法來啟動SecodeActivity,而不再通過startActivity()方法。

startActivityForResult()方法有兩個參數;

第一個參數是Intent,

第二個參數是請求碼,用于在回調中判斷資料的來源。

在SecodeActivity中傳回時,先建構intent,用于傳遞資料,然後調用setResult()方法,最後調用finish()去銷毀目前活動SecodeActivity。

setResult()方法有兩個參數;

第一個參數一般隻使用RESULT_OK或者RESULT_CANCELED,用于向上一個活動傳回處理的結果;

第二個參數是Intent。

SecodeActivity在銷毀後,才會回調上一個活動(firstActivity)的onActivityResult()方法。是以在onActivityResult()方法裡面接收處理資料即可。

onActivityResult()方法有三個參數;

第一個參數是我們啟動活動時出入的請求碼,

第二個參數是傳回資料時傳入的處理結果,

第三個參數是傳回的資料。

firstActivity代碼片段:

button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
        // 傳遞資料,并接收上一個活動傳回的資料
        Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);
        mIntent.putExtra("data", "This data is from firstActivity");
        startActivityForResult(mIntent,);
    }
});

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        // case 1 -> 這裡的1就是startActivityForResult(mIntent,1)裡面的1。
        case :
            if (resultCode == RESULT_OK) {
                // getData 就是從SecodeActivity傳回給firstActivity的資料。
                // 即getData的内容為:This data is from SecodeActivity
                String getData = data.getStringExtra("data");
            }
            break;
    }
}
           
SecodeActivity代碼片段:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.secode_layout);

    Intent intent = getIntent();
    // getData 就是從firstActivity擷取到的資料。
    // 即getData的内容為:This data is from firstActivity
    String getData = intent.getStringExtra("data");
}

// 當按傳回鍵時,讓SecodeActivity銷毀。隻有當SecodeActivity銷毀才會回調firstActivity中的onActivityResult()方法

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    // 将要傳回給firstActivity的資料
    intent.putExtra("data","This data is from SecodeActivity");
    setResult(RESULT_OK, intent);
    finish();
}
           

finish()和System.exit(0)

finish():僅僅把目前Activity退出了,但是并沒有釋放資源。

System.exit(0):是退出整個應用程式的,是針對整個Application的。将整個程序直接kill,活動所占的資源會被釋放。等同于使用android.os.Process.killProcess(android.os.Process.myPid());