個人解讀Activity之一 – Android移動開發技術文章_手機開發 Android移動開發教學課程

前面翻譯瞭以下有關Activity的官方文檔,接下來,我將把自己理解的Activity也記錄下來!這裡的記錄就是按照前面的那七個小的主題來介紹!即:

1、Fragments

2、Activity的生命周期
3、配置改變
4、啟動Activities並獲取結果
5、保存持久的狀態
6、權限
7、進程的生命周期

       但是我們這裡不按照一次順序介紹,由於Fragment是另一個比較大的議題,和Activity有關,不是一下就能介紹完的,為瞭不沖淡我們的主題Activity,我們暫且將其放一放,待對Activity有一些認識之後再來詳細的討論一下關於Fragment的內容。

       所以,首先我們來介紹有關Activity生命周期的內容!我們通過一個以下的小實驗來理解Activity的生命周期:

       第一步:創建一個新的工程:LifeCycle,這時候打開AndroidManifest.xml文件可以看到已經有瞭一個Activity瞭!

       第二步:打開LifeCycleActivity.java文件,實現前面提到的7個方法:onCreate()等等。代碼如下:

        private static final String mark="LifeCycle";


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Log.i(mark, "onCreate"); 

 
@Override 
protected void onStart() { 
    super.onStart(); 
    Log.i(mark, "onStart"); 

 
@Override 
protected void onRestart() { 
    super.onRestart(); 
    Log.i(mark, "onRestart"); 

 
@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i(mark, "onResume"); 

 
@Override 
protected void onPause() { 
    super.onPause(); 
    Log.i(mark, "onPause"); 

 
@Override 
protected void onStop() { 
    super.onStop(); 
    Log.i(mark, "onStop"); 

 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    Log.i(mark, "onDestroy"); 

       第三步:點擊運行,在日志文件中可以看到如下內容:

當我們關閉這個應用的時候,可以再日志文件中看到如下內容:

 在這裡,我們看到七種方法隻調用瞭其中的六種,onRestart()並沒有被調用,為什麼會這樣呢?隻要看一下那個生命周期圖就知道瞭,當activity不可見時,activity進入暫停狀態,此刻要想activit重啟,則需要使不可見的activity變為可見,這裡可以利用一個應用程序的多個activities來進行測試,這涉及到再一個activity中啟動另一個activity,我們稍候進行!
    

     現在,我們介紹再一個activity中啟動另一個activity,我想,大傢一想就能想到再窗口上放置一個按鈕,為按鈕設置事件監聽器,當按下按鈕的時候,啟動另一個activity。

     第一步:新建一個工程multiactivity;

     第二步:在佈局文件layout/main.xml中添加一個按鈕,並設置ID屬性Button01,代碼如下:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="我是第一個Activity" /> 
     
    <Button  
        android:id="@+id/Button01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="啟動第二個Activity"/> 
 
</LinearLayout> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="我是第一個Activity" />
   
    <Button
        android:id="@+id/Button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="啟動第二個Activity"/>

</LinearLayout>

第三步:修改multiactivity.java文件,代碼如下:


private static final String mark="LifeCycle"; 
private Button myBtn01; 
   @Override 
   public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       Log.i(mark, "onCreate"); 
       myBtn01 = (Button)findViewById(R.id.Button01); 
       myBtn01.setOnClickListener(new View.OnClickListener() { 
         
        public void onClick(View v) { 
            // TODO Auto-generated method stub  
            Intent intent = new Intent(LifeCycleActivity.this, SecondActivity.class); 
            startActivity(intent); 
        } 
    }); 
   } 
    
   @Override 
   protected void onStart() { 
    super.onStart(); 
    Log.i(mark, "onStart"); 
   } 
    
   @Override 
   protected void onRestart() { 
    super.onRestart(); 
    Log.i(mark, "onRestart"); 
   } 
    
   @Override 
   protected void onResume() { 
    super.onResume(); 
    Log.i(mark, "onResume"); 
   } 
    
   @Override 
   protected void onPause() { 
    super.onPause(); 
    Log.i(mark, "onPause"); 
   } 
    
   @Override 
   protected void onStop() { 
    super.onStop(); 
    Log.i(mark, "onStop"); 
   } 
    
   @Override 
   protected void onDestroy() { 
    super.onDestroy(); 
    Log.i(mark, "onDestroy"); 
   } 
 private static final String mark="LifeCycle";
 private Button myBtn01;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i(mark, "onCreate");
        myBtn01 = (Button)findViewById(R.id.Button01);
        myBtn01.setOnClickListener(new View.OnClickListener() {
   
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(LifeCycleActivity.this, SecondActivity.class);
    startActivity(intent);
   }
  });
    }
   
    @Override
    protected void onStart() {
     super.onStart();
     Log.i(mark, "onStart");
    }
   
    @Override
    protected void onRestart() {
     super.onRestart();
     Log.i(mark, "onRestart");
    }
   
    @Override
    protected void onResume() {
     super.onResume();
     Log.i(mark, "onResume");
    }
   
    @Override
    protected void onPause() {
     super.onPause();
     Log.i(mark, "onPause");
    }
   
    @Override
    protected void onStop() {
     super.onStop();
     Log.i(mark, "onStop");
    }
   
    @Override
    protected void onDestroy() {
     super.onDestroy();
     Log.i(mark, "onDestroy");
    }      

第四步:創建第二個Activity,命名為SecondActivity

第五步:為SecondActivity設置佈局文件:second.xml,內容如下:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
 
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="我是第二個Activity" /> 
     
        <Button  
        android:id="@+id/Button02" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="返回第一個Activity"/> 
         
</LinearLayout> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="我是第二個Activity" />
 
        <Button
        android:id="@+id/Button02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回第一個Activity"/>
       
</LinearLayout>       

第六步:修改SecondActivity.java文件,代碼如下:


public class SecondActivity extends Activity { 
    private Button myBtn02; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.second); 
        myBtn02 = (Button)findViewById(R.id.Button02); 
        myBtn02.setOnClickListener(new View.OnClickListener() { 
             
            public void onClick(View v) { 
                // TODO Auto-generated method stub  
                Intent intent = new Intent(SecondActivity.this,LifeCycleActivity.class); 
                startActivity(intent); 
            } 
        }); 
    } 

public class SecondActivity extends Activity {
 private Button myBtn02;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        myBtn02 = (Button)findViewById(R.id.Button02);
        myBtn02.setOnClickListener(new View.OnClickListener() {
   
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(SecondActivity.this,LifeCycleActivity.class);
    startActivity(intent);
   }
  });
    }
}      第七步:修改AndroidManifest文件,聲明自己的SecondActivity,如下:


<application 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
        <activity 
            android:label="@string/app_name" 
            android:name=".LifeCycleActivity" > 
            <intent-filter > 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
        <activity 
            android:name="SecondActivity" > 
        </activity> 
    </application> 
<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".LifeCycleActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="SecondActivity" >
        </activity>
    </application>     

第八步:運行程序,這裡我們分幾個小步。

        第一小步:啟動程序,可看到如下內容:

 

     第二小步:點擊按鈕,出現如下內容:
 

  第三步:我們單擊模擬器上的返回按鈕,出現如下內容:

好瞭,到這裡大傢就可以看到我們的onRestart()方法被調用瞭吧!

這裡有幾點是需要註意的

      1、Log打印的都是第一個Activity的狀態信息,大傢看代碼就知道瞭,這個不要看混淆瞭

      2、在第二個Activity我也放瞭一個按鈕返回第一個Activity,但是當通過點擊這個按鈕返回到第一個Activity時,並沒有調用onRestart()方法,而是直接調用onCreate()方法,通過看生命周期圖,我發現第二個Activity運行時,第一個Activity貌似已經被殺死瞭,所以直接調用瞭onCreate(),而通過按下模擬器的返回的物理按鍵則可以看到該方法被調用瞭,這有點不理解!希望知道的人可以指教一下!

好瞭,先到這吧!www.aiwalls.com

 摘自 chenlong12580的專欄

發佈留言