Android開發祕籍學習筆記(一)

  該目錄爲Android的一些學習筆記。

Android四大組件之—-Activity

  Android中有4大組件,它們分別是Activity、Service、BroadcastReceiver、ContentProvide。它們的功能如下表:

這裏寫圖片描述

  要學Activity首先肯定要了解Activity的生命週期,首先我們看Android官方API的介紹:
這裏寫圖片描述
  先來了解下,Activity中重要的四種狀態和七種方法
一)四種狀態
1. 活動(Active/Running)狀態
當Activity運行在屏幕前臺(處於當前任務活動棧的最上面),此時它獲取了焦點能響應用戶的操作,屬於運行狀態,同一個時刻只會有一個Activity 處於活動(Active)或運行

  1. 暫停(Paused)狀態
    當Activity失去焦點但仍對用戶可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等彈出窗口時)它處於暫停狀態。暫停的Activity仍然是存活狀態(它保留着所有的狀態和成員信息並保持和窗口管理器的連接),但是當系統內存極小時可以被系統殺掉

  2. 停止(Stopped)狀態

完全被另一個Activity遮擋時處於停止狀態,它仍然保留着所有的狀態和成員信息。只是對用戶不可見,當其他地方需要內存時它往往被系統殺掉

  1. 非活動(Dead)狀態

Activity 尚未被啓動、已經被手動終止,或已經被系統回收時處於非活動的狀態,要手動終止Activity,可以在程序中調用”finish”方法

二)七種方法
通常用於初始化設置: 1、爲Activity設置所要使用的佈局文件2、爲按鈕綁定監聽器等靜態的設置操作

  onCreate(Bundle savedInstanceState);

當Activity可見未獲得用戶焦點不能交互時系統會調用

  onStart();

當Activity已經停止然後重新被啓動時系統會調用

  onRestart();

當Activity可見且獲得用戶焦點能交互時系統會調用

  onResume();

  當系統啓動另外一個新的Activity時,在新Activity啓動之前被系統調用保存現有的Activity中的持久數據、停止動畫等,這個實現方法必須非常快。當系統而不是用戶自己出於回收內存時,關閉了activity 之後。用戶會期望當他再次回到這個activity 的時候,它仍保持着上次離開時的樣子。此時用到了onSaveInstanceState(),方法onSaveInstanceState()用來保存Activity被殺之前的狀態,在onPause()之前被觸發,當系統爲了節省內存銷燬了Activity(用戶本不想銷燬)時就需要重寫這個方法了,當此Activity再次被實例化時會通過onCreate(Bundle savedInstanceState)將已經保存的臨時狀態數據傳入因爲onSaveInstanceState()方法不總是被調用,觸發條件爲(按下HOME鍵,按下電源按鍵關閉屏幕,橫豎屏切換情況下),你應該僅重寫onSaveInstanceState()來記錄activity的臨時狀態,而不是持久的數據。應該使用onPause()來存儲持久數據。

onPause();

當Activity被新的Activity完全覆蓋不可見時被系統調用

  onStop();

當Activity(用戶調用finish()或系統由於內存不足)被系統銷燬殺掉時系統調用,(整個生命週期只調用1次)用來釋放onCreate ()方法中創建的資源,如結束線程等

  onDestroy();

  我自己本來也想個寫了實例測試,發現網上早有大神測試過了,故我這裏就不自己來了,直接將兩分鐘徹底讓你明白Android Activity生命週期(圖文)!
應用過來,這裏基本講全了,我這裏補充點屏幕切換時的生命週期以及Activity切換時的狀態變化。
  在橫豎屏切換時,網上有人是這麼說的
1、運行Activity,得到如下信息

onCreate–>
onStart–>
onResume–>

2、按crtl+f12切換成橫屏時

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

3、再按crtl+f12切換成豎屏時,發現打印了兩次相同的log

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

4、修改AndroidManifest.xml,把該Activity添加android:configChanges=”orientation”,執行步驟3

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

5、再執行步驟4,發現不會再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onConfigurationChanged–>

6、把步驟5的android:configChanges=”orientation” 改成 android:configChanges=”orientation|keyboardHidden”,執行步驟3,就只打印onConfigChanged

onConfigurationChanged–>

7、執行步驟4

onConfigurationChanged–>
onConfigurationChanged–>

總結:

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次

3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
但是我用Genymotion測試後發現得到的結果和他有些差距。首先啓動Activty同樣是
這裏寫圖片描述
我切換成橫屏也和他一樣
這裏寫圖片描述
但是我切換回豎屏是卻不是他說的會打印2次
這裏寫圖片描述
之間的原因我懷疑是模擬器的問題。
  在Activity切換時,狀態變化則是
啓動第一個界面Activity One時,它的次序是

         onCreate (ONE) - onStart (ONE) - onResume(ONE)

打開第二個Activity:

   onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO)

Back後第一個Activity:

onPause(TWO) - onActivityResult(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)

最後是按下HOME鍵:
這裏寫圖片描述

Activity中數據傳遞的方法
1、使用剪切板方式clipboardManager
Activity A 中的內容傳值到Activity B
A中代碼:

String name = "XXXXXXXX";
ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);  
         cm.setText();  
         Intent in = new Intent(MainActivity.this, Other.class);  
         startActivity(in);  

B中代碼:

ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
cm.getText();

2、使用intent傳值
方法一:只需傳遞少量參數
Activity A 中的內容傳值到Activity B
A中代碼:

Intent intent = new Intent();
                intent.setClass(getApplicationContext(), SecondActivity.class);
                intent.putExtra("username","Cui");
                startActivity(intent);

B中代碼:

Intent intent2 = getIntent();
        String str = intent2.getStringExtra("username");
        textview2.append(str);

方法二:通過Bundle封裝數據進行傳遞
Activity A 中的內容傳值到Activity B
A中代碼:

Intent intent=new Intent();  
 intent.setClass(OneActivity.this, OtherActivity.class);  
Bundle bundle = new Bundle();
                bundle.putString("user", "Cui");
                bundle.putInt("number", 12312);
                intent.putExtras(bundle);
startActivity(intent)

B中代碼:

Bundle bundle = new Bundle();
        bundle = intent2.getExtras();
        String str4 = bundle.getString("user");
        int num = bundle.getInt("number");
        textview4.append(str4 + num);

3、使用Application
  在Android中,有一個名爲Application的類,我們可以在Activity中使用getApplication(),方法來獲得,它是代表我們的應用程序的類,使用它可以獲得當前應用的主題,資源文件中的內容等,這個類更靈活的一個特性就是可以被我們繼承,來添加我們自己的全局屬性。
使用方法爲繼承Application,定義所需類型變量,定義對應的get 和 put 方法即可

/**************************************************/

  之前我們都是使用startActivity(intent)進行Activity之間的切換,還有一種常用的Activity切換的方法是startActivityForResult(intent, requestCode)

startActivityForResult:
  startActivityForResult的主要作用就是它可以回傳數據,可以一次性完成這項任務,當程序執行到這段代碼的時候,假若從T1Activity跳轉到下一個TActivity,而當這個T2Activity調用了finish()方法以後,程序會自動跳轉回T1Activity,並調用前一個T1Activity中的onActivityResult( )方法。
  這裏需要注意的還有兩個方法—–onActivityResult(int requestCode, int resultCode, Intent data),setResult(int resultCode, Intent data)。下面將直接在例子中說明各個函數的使用。

Activity First:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MainActivity extends Activity {

    TextView tv1;
    Button btn1,ed_btn1,ed_btn2;
    EditText ed_text1,ed_text2;
    Intent intent;
    private int requestCode; 


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity", "onCreate ~~~~");
        btn1 = (Button) findViewById(R.id.btn1);
        intent = new Intent();
        intent.setClass(getApplicationContext(), SecondActivity.class);
        btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                intent.putExtra("username","Cui");
                intent.putExtra("password", "Did you love me");
                ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
                cm.setText("ClipboardManager傳遞的參數");

                Bundle bundle = new Bundle();
                bundle.putString("user", "Cui");
                bundle.putInt("number", 12312);
                intent.putExtras(bundle);


                startActivity(intent);
            }
        });

        ed_text1 = (EditText) findViewById(R.id.ed_text1);
        ed_text2 = (EditText) findViewById(R.id.ed_text2);
        ed_text1.setText("EditText 01 ");
        ed_text2.setText("EditText 02 ");


        ed_btn1 = (Button) findViewById(R.id.ed_btn1);
        ed_btn2 = (Button) findViewById(R.id.ed_btn2);

        ed_btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                 requestCode = 1;
                 startActivityForResult(intent, requestCode);
            }
        });

        ed_btn2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                requestCode = 2;
                startActivityForResult(intent, requestCode);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String text1 = data.getStringExtra("ed_text1");
        String text2 = data.getStringExtra("ed_text2");

        switch (resultCode) {
        case RESULT_OK:
            if(requestCode == 1){
                ed_text1.setText(text1);
            }
            else{
                ed_text2.setText(text2);
            }
            break;
        default:  
            break; 
        }

    }
}

Activity Second:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends Activity {

    TextView textview2,textview3,textview4;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        textview2 = (TextView) findViewById(R.id.textview2);
        textview3 = (TextView) findViewById(R.id.textview3);
        textview4 = (TextView) findViewById(R.id.textview4);

        Intent intent2 = getIntent();
        String str = intent2.getStringExtra("username");
        String str2 = intent2.getStringExtra("password");
        textview2.append(str + str2);
        ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        String str3 = (String) cm.getText();
        textview3.append(str3);

        Bundle bundle = new Bundle();
        bundle = intent2.getExtras();
        String str4 = bundle.getString("user");
        int num = bundle.getInt("number");
        textview4.append(str4 + num);

        Intent intent3 = new Intent();
        intent3.putExtra("ed_text1", "我改變了EditText1的值");
        intent3.putExtra("ed_text2", "我改變了EditText2的值");
        setResult(RESULT_OK, intent3);
    }
}

  運行程序後,點擊”go to next Activity”
這裏寫圖片描述
  將在SecondActivity中顯示各種傳遞Activity傳遞數據的方法結果。
這裏寫圖片描述
BACK鍵返回,MainActivity後點擊EditText下面的兩個Button
進入SecondActivity後在BACK鍵返回MainActivity,得到
這裏寫圖片描述

至此,關於Activity的知識學習到此。

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