天天看點

Android開發之Activity

第二章 Activity

含義: Activity是包含使用者界面的元件,用于和使用者進行互動。

一、建立Activity步驟:

1、Android studio自動建立空的Activity

2、銷毀activity:finish();

3、删除Activity:清單中注冊、編輯布局、加載布局

二、采用Intent切換activity

1、顯式Intent

startActivity(new Intent(MainActivity.this,SecondActivity.class));

2、隐式Intent

隐式Intent并不能實作直接跳轉,需要指定兩個條件(intent-filter):action和category。

如果在intent-filter中指定category為default的category,即android.intent.category.DEFAULT,則隻需滿足action條件即可。

intent-filter在注冊activity時添加,注冊方法如下:

<activity android:name=".SecondActivity" >
        <intent-filter><action android:name="com.example.demo1activity.SECOND_START" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</activity>
           

跳轉方法為:

Intent intent=new Intent(“com.example.demo1activity.SECOND_START”);

startActivity(intent);

intentfilter中隻能有一個action,但可以有多個category,滿足其中一個category即可。

3、隐式Intent的其他用法

使用隐式intent,不但可以打開自己編寫的activity,還可以打開系統編寫的activity,比如浏覽器,打電話等。

打開浏覽器:

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

解釋:

Intent.ACTION_VIEW是系統内置的動作,打開浏覽器;

setData()将一個Uri對象傳入intent,用于指定該intent正在操作的資料,這些資料都是用Uri.parse()将字元串轉換為Uri産生的。

在intent-filter中,添加标簽,用于精确指定該activity能響應的資料類型,包括

android:scheme用于指定資料的協定部分,比如http。

該方法還可以打電話、顯示地理位置等。

三、Intent傳遞資料

1、向下一個activity傳遞資料

在頭一個activity中,使用putExtra()将資料傳入intent

在下一個activity中,使用getIntent()獲得傳遞來的intent,然後使用getStringExtra()獲得傳遞來的資料。

2、傳回資料給上一個activity

在上一個activity中,不采用startActivity(),而采用startActivityForResult(intent, 1)。其中,1為requestCode,用于之後判斷是不是自己發送出去的intent。

在下一個activity中,建立新的intent,然後将data利用intent.putExtra()放入intent,setResult(RESULT_OK, intent)放置result,其中RESULT_OK為resultcode,用于在上一個activity中分辨是哪一個activity傳回的資料。最後,finish()。

之後,在上一個activity中,重寫onActivityResult()方法。

同樣的,如果在第二個activity中,是按傳回鍵傳回的,可以在第二個activity中,重寫onBackPressed()方法傳回資料,方法同上。

四、activity的生命周期

1、活動狀态

運作狀态:在棧頂時

暫停狀态:不可操作,但可見

停止狀态:完全不可見

銷毀狀态:從棧中被移除

2、activity生存期

完整生存期:onCreate()onDestory()

可見生存期:onStart()onStop()

前台生存期:onResume()onPause()

3、activity被回收資料儲存

activity中提供了一個onSaveInstanceState()的方法,該方法會攜帶一個bundle類型參數,bundle可以儲存各種資訊。

protected void onSaveInstanceState(Bundle outState) {

// TODO Auto-generated method stub

super.onSaveInstanceState(outState);

String savedata=”hello you”;

outState.putString(“saved”, savedata);

}

如何恢複資料呢?

在onCreate()方法中,傳入的參數為Bundle savedInstanceState,利用這恢複資料。

String data=savedInstanceState.getString(“saved”);

五、activity的啟動模式

四種啟動模式,可以在标簽中android:launchMode定義。

standard:打開activity,就放入棧頂

singleTop:打開activity,檢查棧頂是否已經存在該activity,存在了就不建立。不存在才建立。不過,如果該activity不在棧頂,但也存在,則也會重新建立一個。

singleTask:檢查整個傳回棧,如果存在某個activity,則不會重新建立。

singleInstance:建立一個activity,重新在一個新的傳回棧(或Task)中建立,該activity與其他activity不在同一個Task中,其他程式也可以調用這個activity的執行個體。

六、activity最佳實踐

1、知道目前頁面是哪一個activity

建立一個BaseActivity extents Activity,其中在onCreate()中列印該activity的資訊

Log.i(“BaseActivity”,getClass().getSimpleName()); //獲得類名

然後,所有activity都extents BaseActivity即可

2、随時随地退出程式

當打開很多activity之後,退出程式需要一直按Back,很麻煩。

首先,建立一個activity管理類,實作所有的activity的添加、删除和finish()。

public class ActivityCollector {
public static List<Activity> activities=new ArrayList<Activity>();
public static void addActivity(Activity activity){
    activities.add(activity);
}

public static void removeActivity(Activity activity){
    activities.remove(activity);
}

public static void finishAll(){
    for(Activity activity:activities){
        if(!activity.isFinishing()){
            activity.finish();
        }
    }
}
           

}

然後,修改BaseActivity,在onCreate()中添加this,onDestory()中移除this

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

Log.i(“BaseActivity”, getClass().getSimpleName());

ActivityCollector.addActivity(this);

}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    ActivityCollector.removeActivity(this);
}
           

3、給每個activity都添加一個合适的啟動方法

比如我需要啟動一個SecondActivity,可是不知道該activity需要哪些參數,怎麼辦?

在SecondActivity中添加一個啟動自己的方法:

public class SecondActivity extends Activity{
…
public static void startActivity(Context contex, String data1, String data2){
Intent intent = new Intent(context, SecondActicity.class);
intent.putExtra(“param1”, data1);
intent.putExtra(“param2”, data2);
startActivity(intent);}}
           

在SecondActivity中添加了startActivity()方法之後,在任意的activity中啟動SecondActivity,都可以調用該方法,而且知道需要傳入哪些參數。

比如在MainActivity中啟動方法為:

SecondActivity.startActivity(MainActivity.this, “data1”, “data2”);

七、基本知識

1、Toast:可以自定義樣式

2、Menu

兩種建立方式:靜态與動态方式

一種中選擇方式:

一種打開方式:

3、隐藏标題欄

requestWindowFeature(Window.FFEATURE_NO_TITLE);
           

注意:這句話必須加在setContentView之前。