Activity

一、activity的定義
activity是應用程序的一個組件,他提供一個屏幕用於應用程序和用戶之間的交互。

二、activity的生命週期
onCreate()——當活動首次創建時調用,一般在這進行初始化工作,初始化數據,視圖等;
onStart()——當活動對用戶可見時調用,可見但是不可以交互;
onResume()——活動對用戶完全可見並且可以交互;
onPause()——當前活動被暫停(可以是可見的);
onStop()——活動不再對用戶可見;
onDestroy()——活動被銷燬;
onRestart()——在活動被停止(onStop),並且再次啓動時調用,之後又進入到onStart();

三、activity的啓動方法
一般可以分爲顯示啓動可隱式啓動。
顯示啓動:
1.直接啓動class

Intent intent=new Intent();
intent.setClass(this,YourActivity.class);
startActivity(intent);

2.通過包名

Intent intent = new Intent("android.intent.action.MAIN");               intent.setClassName("wy.bzt.com.phonehelper",                       "wy.bzt.com.phonehelper.activity.f4.MyActivity");
                startActivity(intent);

隱式啓動:通過指定Action或Action和Data屬性啓動Activity,如果有多個Activity符合這個啓動條件,系統會讓用戶選擇啓動那個應用。
在清單文件裏面添加

 <intent-filter>
   <action android:name="com.wy.android.MyActivity"/>
   <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

之後再activity中調用:

 Intent intent = new Intent("com.wy.android.MyActivity");
                startActivity(intent);

四、activity的啓動模式
activity的啓動模式一共有4種,在清單文件中配置:android:launchMode=”standard|singleTask|singleInstance|singleTop”其中所需要的一種即可。
1.standard
默認啓動模式,每次啓動Activity時都會創建Activity,並放入當前任務棧中,可以存在多個相同activity實例;

2.singleTop
如果當前activity已經存在,並且在當前任務棧頂,則重用當前activity;如果不在棧頂,則創建新的activity實例;

3.singleTask
如果目標activity已有實例,則重用此activity,並且調用activity的onNewIntent()方法,如果此實例不在任務棧頂,會將此activity提至棧頂,他上面的activity會被移除;沒有實例就創建新的實例。

4.singleInstance
在一個新的任務棧中創建目標activity。

注:onNewIntent()非常好用,Activity第一啓動的時候執行onCreate()—->onStart()—->onResume()等後續生命週期函數,也就時說第一次啓動Activity並不會執行到onNewIntent(). 而後面如果再有想啓動Activity的時候,那就是執行onNewIntent()—->onResart()——>onStart()—–>onResume()。
當調用到onNewIntent(intent)的時候,需要在onNewIntent() 中使用setIntent(intent)賦值給Activity的Intent.否則,後續的getIntent()都是得到老的Intent。

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        //setIntent(intent);需要的時候設置
    }

五、activity之間的信息傳遞
1.通過intent/Bundle
跳轉時往裏面添加信息,在目標activity中取得信息。可以傳遞的信息有多種:Intent/Bundle支持傳遞基本類型的數據和基本類型的數組數據,以及String/CharSequence類型的數據和String/CharSequence類型的數組數據。序列化的對象也可以傳遞。序列化對象,只要在數據類型中實現Parcelable接口或是Serializable接口。

2.通過全局變量
繼承Application創建實例,可以在跳轉時改變其中的變量,在目標activity中取得此變量的值。

3.剪切板傳遞(不熟悉)

六、橫豎屏切換時activity的生命週期
1.不設置Activity的android:configChanges,會重新執行生命週期,切換橫屏時,onPause()>onStop()>onDestroy()>onCreate>onStart>onResume;在切換豎屏時,onPause()>onStop()>onDestroy()>onCreate>onStart>onResume;
2. android:configChanges=”keyboardHidden|orientation|screenSize”之後切換時,不會重新調用生命週期,只會調用onConfigurationChanged方法。

七、保持橫屏或者豎屏的方法:
對應的activiy中配置:android:screenOrientation=”landscape”(橫屏,portrait是豎屏);

八、保存activity的狀態
有時候activity被回收了,想保存activity中的一些值,則可以重寫

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

重寫此方法,將需要保存的值保存到outState中,在

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

判斷savedInstanceState是否爲null,不是,就去裏面取值即可。

九、將一個activity設置成窗口形式
在清單文件中:

 <activity android:name=".MainActivityB"
             android:theme="@android:style/Theme.Dialog"/>

更多的設置可以在style文件中設置主題style。

十、如何退出Activity?如何安全退出已調用多個Activity的Application?

1.退出當前activity,按返回鍵或者在代碼中調用finish()方法即可;
2.關閉多個activity,退出程序,常用的做法是創建一個基類activity,在裏面創建一個裝activity的集合,其他的activity繼承基類,每打開一個activity,就將其添加到基類的集合中,關閉時,循環finish掉集合中的activity即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章