亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

全面解析Android應(yīng)用開發(fā)中Activity類的用法

 更新時間:2016年02月29日 14:57:44   作者:時光微涼  
這篇文章主要介紹了Android應(yīng)用開發(fā)中Activity類的用法,包括Activity間的數(shù)據(jù)傳遞以及Activity的創(chuàng)建方式等,需要的朋友可以參考下

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

2016229145632612.png (545×711)

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

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

下面是獲取數(shù)據(jù):

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

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

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

獲取數(shù)據(jù):

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

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

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的三個靜態(tài)變量的值 
        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);   
    //設(shè)置文本框的數(shù)據(jù) 
    text_name.setText("姓名:"+name); 
    text_age.setText("年齡:"+age); 
    text_address.setText("地址:"+address); 
  } 
}

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

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 中獲取到的數(shù)據(jù)為:" + username);
  }
}

三、從Activity返回數(shù)據(jù)
要從Activity返回數(shù)據(jù),需要使用startActivityForResult方法來顯示Activity。
從Activity1跳轉(zhuǎn)到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返回數(shù)據(jù)到Aactivity1:

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

在Activity1中重寫onActivityResault方法,接受數(shù)據(jù):

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

       }

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

1.standard 模式
這是默認(rèn)模式,無需設(shè)置,每次激活A(yù)ctivity時都會創(chuàng)建Activity實例,并放入任務(wù)棧中。相當(dāng)于入棧,按back鍵返回到前一個Activity相當(dāng)于退棧。

2.singleTop 模式
如果在任務(wù)的棧頂正好存在該Activity的實例,就重用該實例( 會調(diào)用實例的 onNewIntent()),否則就會創(chuàng)建新的實例并放入棧頂,即使棧中已經(jīng)存在該Activity的實例,只要不在棧頂,都會創(chuàng)建新的實例??捎脕斫鉀Q棧頂多個重復(fù)相同的Activity的問題

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

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

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

public class MainActivity extends Activity { 
  private String temp;  
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // 從savedInstanceState中恢復(fù)數(shù)據(jù), 如果沒有數(shù)據(jù)需要恢復(fù)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); 

  } 

  // 將數(shù)據(jù)保存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法和onRestoreInstanceState方法
  @Override 
  protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("temp", temp); 
  }

六、一些關(guān)于Activity的技巧
1.設(shè)置Activity的方向

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

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

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

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

Window w=getWindow();
w.setBackgroundDrawableResource(resourceID);//設(shè)置窗口背景
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.關(guān)閉所有窗口

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

另一種方法:在調(diào)用退出方法中寫上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);
   * 
   * 在需要結(jié)束所有Activity的時候調(diào)用exit方法
   * 
   * MyApplication.getInstance().exit();
   */
   public void exit() {

       for (Activity activity : activityList) {
           activity.finish();
       }

       System.exit(0);

   }


相關(guān)文章

  • Java中的Struts2框架攔截器之實例代碼

    Java中的Struts2框架攔截器之實例代碼

    本篇文章主要介紹了Java的Struts2框架攔截器實例的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android選項菜單用法實例分析

    Android選項菜單用法實例分析

    這篇文章主要介紹了Android選項菜單用法,以完整實例形式較為詳細(xì)分析了Android選項菜單的布局及功能實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 解決Android快速滑動時圖片一閃一閃問題

    解決Android快速滑動時圖片一閃一閃問題

    這篇文章主要給大家介紹了個人在解決Android快速滑動時圖片一閃一閃問題的一些思路和方法,非常實用,有需要的小伙伴可以參考下。
    2015-07-07
  • Android實現(xiàn)帶圓環(huán)的圓形頭像

    Android實現(xiàn)帶圓環(huán)的圓形頭像

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)帶圓環(huán)的圓形頭像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    這篇文章主要介紹了詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí),詳細(xì)介紹如何使用MediaProjection,MediaCodec以及MediaMuxer來實現(xiàn)簡單的截屏和錄屏功能。
    2017-04-04
  • Android實現(xiàn)微信支付的統(tǒng)一下單

    Android實現(xiàn)微信支付的統(tǒng)一下單

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)微信支付的統(tǒng)一下單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解Android6.0運(yùn)行時權(quán)限管理

    詳解Android6.0運(yùn)行時權(quán)限管理

    自從Android6.0發(fā)布以來,在權(quán)限上做出了很大的變動,不再是之前的只要在manifest設(shè)置就可以任意獲取權(quán)限,而是更加的注重用戶的隱私和體驗。本文詳細(xì)介紹了Android6.0運(yùn)行時權(quán)限管理。需要的朋友一起來看下吧
    2016-12-12
  • Android音頻開發(fā)之SurfaceView的使用詳解

    Android音頻開發(fā)之SurfaceView的使用詳解

    這篇文章主要為大家介紹了Android中SurfaceView的使用方法,本文通過簡要的案例,為大家進(jìn)行了詳細(xì)的講解,需要的朋友可以參考一下
    2022-04-04
  • Android入門之Gallery用法實例解析

    Android入門之Gallery用法實例解析

    這篇文章主要介紹了Android入門之Gallery用法,對Android初學(xué)者有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2014-08-08
  • Android App中使用ViewPager實現(xiàn)滑動分頁的要點解析

    Android App中使用ViewPager實現(xiàn)滑動分頁的要點解析

    這篇文章主要介紹了Android App中使用ViewPager實現(xiàn)滑動分頁的要點解析,還附帶了一個禁止ViewPager左右滑動的方法,需要的朋友可以參考下
    2016-06-06

最新評論