国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

全面解析Android應用開發中Activity類的用法

2020-01-02 07:03:15
字體:
來源:轉載
供稿:網友

Activity類處于android.app包中,繼承體系如下:
1.java.lang.Object
2.android.content.Context
3.android.app.ApplicationContext
4.android.app.Activity
activity是單獨的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道,所以activity類創建了一個窗口,開發人員可以通過setContentView(View)接口把UI放到activity創建的窗口上,當activity指向全屏窗口時,也可以用其他方式實現:作為漂浮窗口(通過windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。大部分的Activity子類都需要實現以下兩個接口:
onCreate(Bundle)接口是初始化activity的地方. 在這兒通??梢哉{用setContentView(int)設置在資源文件中定義的UI, 使用findViewById(int) 可以獲得UI中定義的窗口.
onPause()接口是使用者準備離開activity的地方,在這兒,任何的修改都應該被提交(通常用于ContentProvider保存數據).
為了能夠使用Context.startActivity(),所有的activity類都必須在AndroidManifest.xml文件中定義有相關的“activity”項。
Activity類是Android 應用生命周期的重要部分。下面我們具體來總結一下Activity的各個要點:
一、Activity的生命周期

2016229145632612.png (545×711)

二、Activity之間傳遞數據
1. 通過Intent傳遞數據
通過Intent.putExtra方法可以將簡單數據類型或可序列化對象保存在Intent對象中,然后在另一個Activity中使用getInt、getString等方法獲得這些數據。示例代碼如下:

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); // 創建一個帶“收件人地址”的 email  Bundle bundle =new Bundle();// 創建 email 內容 bundle.putBoolean("boolean_key", true);// 編寫內容 bundle.putString("string_key", "string_value");  intent.putExtra("key", bundle);// 封裝 email  startActivity(intent);// 啟動新的 Activity

下面是獲取數據:

 Intent intent =getIntent();// 收取 email  Bundle bundle =intent.getBundleExtra("key");// 打開 email  bundle.getBoolean("boolean_key");// 讀取內容 bundle.getString("string_key");

不過使用Bundle傳遞數據稍顯麻煩,如果你只需要傳遞一種類型的值可以這樣:

Intent intent =new Intent(EX06.this,OtherActivity.class);  intent.putExtra("boolean_key", true);  intent.putExtra("string_key", "string_value");  startActivity(intent);

獲取數據:

Intent intent=getIntent();  intent.getBooleanExtra("boolean_key",false);  intent.getStringExtra("string_key");

2. 通過靜態變量傳遞數據
適用于不可序列化的且簡單的對象,不過不推薦使用靜態代碼塊

public class MainActivity extends Activity {   private Button btn;   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     btn = (Button)findViewById(R.id.btOpenOtherActivity);     btn.setOnClickListener(new OnClickListener() {       @Override       public void onClick(View v) {         //定義一個意圖         Intent intent = new Intent(MainActivity.this,OtherActivity.class);         //改變OtherActivity的三個靜態變量的值         OtherActivity.name = "wulianghuan";         OtherActivity.age = "22";         OtherActivity.address = "上海閔行";         startActivity(intent);       }     });   } }public class OtherActivity extends Activity {   public static String name;   public static String age;   public static String address;   private TextView text_name;   private TextView text_age;   private TextView text_address;   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.other);     text_name = (TextView) findViewById(R.id.name);     text_age = (TextView) findViewById(R.id.age);     text_address = (TextView) findViewById(R.id.address);       //設置文本框的數據     text_name.setText("姓名:"+name);     text_age.setText("年齡:"+age);     text_address.setText("地址:"+address);   } }

3.通過全局對象傳遞數據
如果想使某些數據長時間駐留內存,以便程序隨時調用,建議采用全局對象。Application全局類不需要定義靜態變量只要定義普通成員變量即可,但全局類中必須有一個無參構造方法,編寫完Application類后,還需要在<application>標簽中制定全局類名,否則系統不會自動創建全局對象。

public class MainApplication extends Application {  private String username;  public String getUsername() {    return username;  }  public void setUsername(String username) {    this.username = username;  }}public class MainActivity extends Activity {  private MainApplication application;  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    application = (MainApplication) getApplication();    application.setUsername("sunzn");  }  public void open(View view) {    Intent intent = new Intent(this, OtherActivity.class);    startActivity(intent);  }}public class OtherActivity extends Activity {  private TextView tv_data;  private MainApplication application;  private String username;  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_other);    application = (MainApplication) getApplication();    username = application.getUsername();    tv_data = (TextView) findViewById(R.id.tv_data);    tv_data.setText("從上一個 Activity 中獲取到的數據為:" + username);  }}

三、從Activity返回數據
要從Activity返回數據,需要使用startActivityForResult方法來顯示Activity。
從Activity1跳轉到Activity2:

Intent intent = new Intent(); intent = intent.setClass(ActivityIntent.this, AnotherActivity.class); Bundle bundle = new Bundle(); bundle.putString("string", et_string.getText().toString()); intent.putExtras(bundle); startActivityForResult(intent,0); //只有這里不同

從Activity2返回數據到Aactivity1:

Intent intent = new Intent();intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);Bundle bundle = new Bundle();bundle.putInt("result", "Activity2的處理結果");intent.putExtras(bundle); AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回狀態碼AnotherActivity.this.finish();

在Activity1中重寫onActivityResault方法,接受數據:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {          super.onActivityResult(requestCode, resultCode, data);          switch(resultCode) { //根據狀態碼,處理返回結果          case RESULT_OK:              Bundle bundle =data.getExtras(); //獲取intent里面的bundle對象               String result = bundle.getInt("result");           break;           default:          break;          }        }

四、Activity的四種創建模式
我們在開發項目的過程中,會涉及到該應用中多個Activity組件之間的跳轉,或者夾帶其它應用的可復用的Activity。例如我們可能希望跳轉到原來某個Activity實例,而不是產生大量重復的 Activity。這樣就需要我們為 Activity 配置特定的加載模式,而不是使用默認的加載模式。設置啟動模式的位置在 Manifest.xml 文件中 Activity的android:launchMode 屬性

1.standard 模式
這是默認模式,無需設置,每次激活Activity時都會創建Activity實例,并放入任務棧中。相當于入棧,按back鍵返回到前一個Activity相當于退棧。

2.singleTop 模式
如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent()),否則就會創建新的實例并放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。可用來解決棧頂多個重復相同的Activity的問題

3.singleTask 模式
如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。singleTask 模式可以用來退出整個應用。將主Activity設為SingTask模式,然后在要退出的Activity中轉到主Activity,然后重寫主Activity的onNewIntent函數,并在函數中加上一句finish。

4.singleInstance 模式
在一個新棧中創建該Activity的實例,并讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在于某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當于多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。

五、Activity現場保存狀態
一般來說,調用onPause()和onStop()方法后的activity實例仍然存在于內存中,activity的所有信息和狀態數據不會消失, 當activity重新回到前臺之后, 所有的改變都會得到保留。但是當系統內存不足時, 調用onPause()和onStop()方法后的activity可能會被系統摧毀, 此時內存中就不會存有該activity的實例對象了. 如果之后這個activity重新回到前臺, 之前所作的改變就會消失.可以在activity被殺掉之前調用保存每個實例的狀態,開發者可以覆寫onSaveInstanceState()方法. onSaveInstanceState()方法接受一個Bundle類型的參數, 開發者可以將狀態數據存儲到這個Bundle對象中,以保證該狀態在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(傳入的Bundle參數是由onSaveInstanceState封裝好的)中恢復。這個方法在一個activity被殺死前調用,當該activity在將來某個時刻回來時可以恢復其先前狀態。如果調用onSaveInstanceState()方法,調用將發生在onPause()或onStop()方法之前,而且它也不是生命周期的方法。
若向數據庫中插入記錄等,保存持久化數據的操作應該放在onPause()中. onSaveInstanceState()方法只適合保存瞬態數據, 比如UI控件的狀態, 成員變量的值等.

public class MainActivity extends Activity {   private String temp;    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     // 從savedInstanceState中恢復數據, 如果沒有數據需要恢復savedInstanceState為null     if (savedInstanceState != null) {       temp = savedInstanceState.getString("temp");       System.out.println("onCreate: temp = " + temp);     }   }   public void onRestoreInstanceState(Bundle saveInstanceState) {     super.onRestoreInstanceState( saveInstanceState);     String temp = saveInstanceState.getString("temp");     System.out.println("onResume: temp = " + temp);   }   // 將數據保存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法和onRestoreInstanceState方法  @Override   protected void onSaveInstanceState(Bundle outState) {     super.onSaveInstanceState(outState);     outState.putString("temp", temp);   }

六、一些關于Activity的技巧
1.設置Activity的方向

android:screenOrientation="portrait">// 豎屏 , 值為 landscape 時為橫屏

2.設置Activity全屏
在onCreate方法中添加如下代碼:

// 設置全屏模式getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN); // 去除標題欄requestWindowFeature(Window.FEATURE_NO_TITLE);

改變窗口大小、位置、透明度
在onCreate方法中添加如下代碼:

Window w=getWindow();w.setBackgroundDrawableResource(resourceID);//設置窗口背景WindowManager.LayoutParams layoutParams = w.getAttributes();layoutParams.height = 200; layoutParams.width= 200;layoutParams.gravity = Gravity.TOP;layoutParams.x=50;//距離Gravity屬性的距離layoutParams.y=50;layoutParams.alpha = 0.5;//0:完全透明,1:不透明w.setAttributes(layoutParams);

3.關閉所有窗口

Intent intent = new Intent(); intent.setClass(Android123.this, CWJ.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG設置 startActivity(intent)

另一種方法:在調用退出方法中寫上MyApplication.getInstance().exit();

public class MyApplication extends Application {   private List<Activity> activityList = new LinkedList<Activity>();   private static MyApplication instance;   private MyApplication() {   }   // 單例模式中獲取唯一的MyApplication實例   public static MyApplication getInstance() {       if (null == instance) {           instance = new MyApplication();       }       return instance;   }   // 添加Activity到容器中   public void addActivity(Activity activity) {       activityList.add(activity);   }   // 遍歷所有Activity并finish   /*   * 在每一個Activity中的onCreate方法里添加該Activity到MyApplication對象實例容器中   *    * MyApplication.getInstance().addActivity(this);   *    * 在需要結束所有Activity的時候調用exit方法   *    * MyApplication.getInstance().exit();   */   public void exit() {       for (Activity activity : activityList) {           activity.finish();       }       System.exit(0);   }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清丰县| 开平市| 吴堡县| 华蓥市| 大埔区| 蕉岭县| 新宁县| 西乡县| 拜泉县| 郎溪县| 惠东县| 湘潭县| 瑞丽市| 梁河县| 双鸭山市| 鄂尔多斯市| 德保县| 安庆市| 南投县| 汝城县| 友谊县| 黄平县| 山东省| 福州市| 临桂县| 咸宁市| 玉溪市| 达拉特旗| 上思县| 兰溪市| 林甸县| 托克逊县| 乌拉特前旗| 青神县| 扶沟县| 湖口县| 华池县| 锦州市| 河北省| 通州市| 金华市|