Android基礎知識總結

一、基礎知識:
1.Android SDK:Android SDK包含瞭一個調試器、庫、一個模擬器、文檔、實例代碼和教程。
2.ADT: 用於Eclipse的Android開發工具(Android Development Tools,ADT)插件是對Eclipse IDE的擴展,用以支持android應用程序的創建和調試。
3.AVD(Android Virtual Device): AVD是一個模擬器實例,可以用來模擬一個真實的設備。
4.Activity: Activity(活動)是一個包含應用程序的用戶界面窗口。一個應用程序可以有零個或多個活動。Activity 是所有程序的根本,所有程序都運行在Activity之中,Activity具有自己的生命周期,由系統控制生命周期,程序無法改變。
5.Intent:Intent是android中的一種消息通信機制(媒介),專門提供組件互相調用的相關信息,實現調用者和被調用的解耦。
5.1.顯示Intent:指定瞭component屬性的intent(調用 setComponent)或者setClass(context,class)來指定)。通過指定具體的組件類,調用應用啟動對應的組件。
5.2.隱式Intent:沒有指定component屬性的Intent。這些Intent需要包含足夠的信息,這些系統才能根據這些信息,在所有的可用組件中,確定滿足此Intent的組件。
6.Toast: Toast是android中用來顯示信息的一種機制和Dialog不一樣的是,Toast是沒有焦點的,而且Toast顯示的時間有限,過一定時間就會自動消失。
7.Android 操作系統: Android是一種基於Linux的開源的收集操作系統。
8.APK是Android Package的縮寫,即Android安裝包(anapk)。ps:APK文件其實是zip格式,但後綴名修改為APK,通過UnZip解壓後,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執行程序,並非Java ME的字節碼而是Dalvik的字節碼。

9.Android 四大組件(Activity,Service,Broadcast Receiver,Content Provider)

9.1.Activity:應用程序中,一個Activity通常是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。在Intent的描述結構中,有兩個重要的部分:動作和動作對應的數據。

9.2.Broadcast Receiver:廣播接收者(BroadcastReceiver)用於接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadCast()、Context.sendOrderedBroadcast()、Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱瞭此Intent的多個廣播接收者所接收(就像真的收音機一樣)。廣播(Broadcas)是一種廣泛運用的應用程序之間的傳輸消息的機制。而廣播接收者(BroadcastReceiver)是對發送出來的廣播進行過濾並接收響應的一類組件。ps:BroadcastReceiver
廣泛應用與應用間的交流。

9.2.1 BroadcastReceiver生命周期:每次廣播到來時,會重新創建BroadcastReceiver對象,並調用onReceive()方法,執行完以後,該對象即被銷毀。當onReceive()方法在10s內沒有執行完畢,就會導致ANR。如果需要執行長任務,那麼就必須要使用Service。另外在onReceive中使用線程是很危險的事情。因為線程沒有執行完,BroadcastReceiver就掛瞭。

9.3 Service:和Activity屬於同一級別的組件,不能自己運行隻能後臺運行,並且可以和其他組件進行交互。Service可以在很多場合的應用中使用,比如播放多媒體的時候啟動瞭其他Activity這個時候程序要在後臺繼續播放。ps:一個Service是一段長生命周期的,沒有用戶界面的程序,可以用來開發如監控類程序。

9.4 Content Provider:ContentProvider在android中的作用是對外共享數據,也就是說你可以通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對你應用的數據進行增刪改查。關於共享數據,可以使用文件操作模式,通過指定文件的操作模式為Context.MODEWORLDREADABLE 或 Context.MODEWORLDWRITEABLE同樣也可以對外共享數據。但是使用文件共享數據存在數據訪問方式不統一的問題。而Content
Provider則對外暴露瞭統一的接口,每個應用程序都可以通過統一的接口操作數據。

10.常用的佈局管理器:
佈局管理器一般有四種:
LinearLayout:線性佈局管理器(默認),分為水平(horizontal)和垂直(vertical)兩種,隻能進行單行佈局。
FrameLayout:所有組件放在左上角,一個覆蓋一個。
TableLayout:任意行和列的表格佈局管理器,其中TableRow代表一行,可以向行中增加組件。
RelativeLayout:相對佈局管理器,根據最近一個組件或者頂層父組件來確定下一個組件的位置。

11.Android應用程序是用java語言寫的,通過aapt工具把編譯好的java代碼和應用程序所需要的所有數據、資源文件打包成Android包,及後綴為.apk的壓縮文件,這個文件時發佈應用程序和在移動設備上安裝應用程序的媒介,是用戶下載到他們設備上的文件。一個.apk文件中的所有代碼屬於一個應用程序。

10.ANR(Application No Response):程序無響應的錯誤信息。
11.Android體系結構:
官網體系結構圖:
vc7EvP7V67bU0KHE2rTmyrnTw9f2wcvTxbuvoaPNrMqx0OnE4rv6yse7+dPavMS05sb3tcSjrMv509C1xMDgtry+rdPJSmF2YbHg0uvG97Hg0uujrMi7uvPNqLn9U0RL1tC1xKGwZHihsbmkvt/Xqruvs8kuZGV4JiMyNjY4NDvKvdPJ0OnE4rv61rTQ0KGjPGJyPgo8L3A+CjxwPgoxMy5BbmRyb2lkIEFjdGl2aXR5IMn6w/zW3Mbao7o8YnI+Csn6w/zW3Mbazbyjujxicj4KPGltZyBzcmM9″/uploadfile/Collfiles/20140323/20140323091308213.gif” alt=”\”>
Resumed狀態:
在這種狀態下,該Activity在前臺運行,用戶可以與它進行交互。(有時也簡稱為“running”狀態。)
Paused狀態:
在這種狀態下,該Activity被部分遮蔽(被其他在前臺的半透明或不覆蓋整個屏幕的活動遮住)。此狀態不接受用戶輸入,並且不能執行任何代碼。
Stopped狀態:
在這種狀態下,該活動是完全隱藏,不可見的,可視為存在於後臺。雖然停止,活動實例和所有成員變量如狀態信息將被保留,但不能執行任何代碼。
14.(1)當程序第一次運行時用戶會看到主Activity,主Activity可以通過氣筒其他的Activity進行相關操作。(2)當啟動其他的Activity時當前的Activity將會停止,新的Activity將會壓入棧中,同時獲取用戶焦點,這時就可在這個Activity上操作瞭。(3)根據棧的先進後出原則,當用戶按Back鍵時,當前這個Activity銷毀,前一個Activity重新恢復。

15.Activity 之間傳遞數據的幾種方式:
(1) 將數據封裝在Intent變量中。(使用Intent傳遞對象有一個局限性,就是不能傳遞不能序列化的對象)
(2) 使用系統的剪切板來傳遞數據。
獲取剪切板的代碼如下:

ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

(3) 使用全局變量來傳遞數據:
例如:

//myApp是一個應用級別的全局對象,在應用的任何地方都可以調用這個對象。 
MyApp myApp = (MyApp)getApplication();

(4) 使用靜態變量傳遞數據:可以在目標的 Activity 中,聲明公開的靜態屬性,在調用的Activity針對這個屬性進行賦值,來進行數據的傳遞。

16.從Activity中返回數據: (1) startActivity():用於啟動意圖。
(2) startActivityForResult():啟動意圖並獲取返回結果。在等待返回結果的Activity中必須實現onActivityResult方法。

17.finish方法用來結束Activity的生命周期。

二、實現DEMO:
1.利用Intent在兩個Activity之間傳遞數據:
關鍵代碼 在源碼包添加調用者和被調用者的 Activity java類:

調用者 Main.java:
@Override
public class Main extends Activity {

    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加載佈局文件
        setContentView(R.layout.main);
        button = (Button)this.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Main.this,OtherActivity.class);
                //在意圖中傳遞數據
                intent.putExtra("name", "張三");
                intent.putExtra("age", 123);
                intent.putExtra("address", "北京");
                //啟動意圖
                startActivity(intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

被調用者 OtherActivity.java:
public class OtherActivity extends Activity {

    private TextView textView;

    public OtherActivity() {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.other);
        textView = (TextView)this.findViewById(R.id.msg);
        Intent intent = getIntent();
        int age = intent.getIntExtra("age", 0);
        String name = intent.getStringExtra("name");
        String address = intent.getStringExtra("address");

        textView.setText("age -->>"+age+"\n"+"name-->>"+name+"\n addresss-->>"+address);

    }
}

在res的layout目錄下配置兩個佈局配置文件:

主Activity的配置文件 main.xml 中添加:
 

在Mainifest.xml程序清單中添加Activity的配置。全部配置完畢後就完成瞭一個Activity通過Intent傳遞信息到另一個Activity的過程。

效果圖: 調用者:
被調用者:

發佈留言