<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 第二天Android程序設計基礎. ## ### 2.1 深入了解安卓 ### ![](https://box.kancloud.cn/2016-05-21_573fc2ea21955.png) ![](https://box.kancloud.cn/2016-05-21_573fc2ea4dcf2.png) #### 2.1.1 工程結構解析 #### + src: Java源代碼目錄(只允許有一個包) + AndroidMainfest.xml: (清單文件,描述應用程序構成、組件、權限等配置信息) + gen/R.java: 資源文件,修改后自動重新生成 + Android: 庫 + assets: 靜態資產文件(用于存放不編譯的資源最大支持1G) + drawable: 程序圖標(ico.png) + layout: 布局文件夾 + values: 程序用到的string、顏色(string.xml) + classes.dex: 編譯的java二進制碼 Android平臺上的可執行文件 + ActivityLifeCycle.apk: Android安裝包(APK 包) + resources.ap_: 資源信息文件 #### 2.1.2 Android中JAVA包功能描述 #### + android.app: 提供高層程序模型、提供基本的運行環境 + android.content: 對設備上的數據進行訪問和發布的類 + android.database: 通過內容提供者瀏覽和操作數據庫 + android.graphics: 底層的圖形庫 + android.location: 定位和相關服務的類 + android.media: 管理多種音頻、視頻的媒體接口 + android.net: 提供幫助網絡訪問的類 + android.os: 提供了系統服務、消息傳輸、IPC 機制 + android.opengl: 提供OpenGL 的工具 + android.provider: 提供類訪問Android內容提供者 + android.telephony: 提供與撥打電話相關的API交互 + android.view: 提供基礎的用戶界面接口框架 + android.util: 涉及工具性的方法,例如時間日期的操作 + android.webkit: 默認瀏覽器操作接口 + android.widget: 包含各種UI元素在應用程序的屏幕中使用 #### 2.1.3 Android程序核心組件 #### + View: 界面視圖、組織UI控件 + Intent: 意圖,支持組件間通信 + Activity: 處理界面與UI互動 + Content Provider: 存儲共享數據 + IntentReceiver: 接收信息及事件處理 + Service: 后臺服務(如硬件與驅動的服務) + Notification: 消息與通知 ### 2.2 了解Activity ### #### 2.2.1 Activity的概念 #### + 活動是最基本的Android應用程序組件 + 一個活動通常就是一個單獨的屏幕,它將會顯示由視圖控件組成的用戶接口,并對事件做出響應以啟動其他組件。 + 當一個新的屏幕打開后,前一個屏幕將會暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中的前一個屏幕。當屏幕不再使用時,還可以從歷史堆棧中刪除。Android將會保留從主屏幕到每一個應用的運行屏幕。 + 所有應用的Activity都繼承于android.app.Activity 類 #### 2.2.2 Activity的生命周期 #### + void onCreate(Bundle savedInstanceState) + void onStart() + void onRestart() + void onResume() + void onPause() + void onStop() + void onDestroy() ![](https://box.kancloud.cn/2016-05-21_573fc2ea6c71b.png) Activity有三個狀態: 1. 當它在屏幕前臺時(位于當前任務堆棧的頂部),它是激活或運行狀態。它就是響應用戶操作的Activity。 2. 當它失去焦點但仍然對用戶可見時(如右圖),它處于暫停狀態。即在它之上有另外一個Activity。這個Activity也許是透明的,或者沒有完全覆蓋全屏,所以被暫停的Activity仍對用戶可見。暫停的Activity仍然是存活狀態(它保留著所有的狀態和成員信息并保持和窗口管理器的連接),但系統處于極低內存時仍然可以殺死這個Activity。 3. 完全被另一個Activity覆蓋時則處于停止狀態。它仍然保留所有的狀態和成員信息。然而對用戶是不可見的,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個Activity。 當Activity從一種狀態轉變到另一種狀態時,會調用以下保護方法來通知這種變化: 這七個方法定義了Activity的完整生命周期。實現這些方法可以幫助我們監視其中的三個嵌套生命周期循環: 1. Activity的完整生命周期自第一次調用onCreate()開始,直至調用onDestroy()為止。Activity在onCreate()中設置所有“全局”狀態以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果Activity有一個線程在后臺運行從網絡上下載數據,它會在onCreate()創建線程,而在 onDestroy()銷毀線程。 2. Activity的可視生命周期自onStart()調用開始直到相應的onStop()調用結束。在此期間,用戶可以在屏幕上看到Activity,盡管它也許并不是位于前臺或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中注冊一個BroadcastReceiver來監控會影響UI的變化,而在onStop()中來注消。onStart() 和 onStop() 方法可以隨著應用程序是否為用戶可見而被多次調用。 3. Activity的前臺生命周期自onResume()調用起,至相應的onPause()調用為止。在此期間,Activity位于前臺最上面并與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態轉換——例如當設備轉入休眠狀態或者有新的Activity啟動時,將調用onPause() 方法。當Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。關于前臺生命周期循環的例子請見PPT下方備注欄。 (活動通俗來說就活動的可操縱的窗口) ### 2.3 了解Intent ### #### 2.3.1 什么是意圖: #### 1. Android基本的設計理念是鼓勵減少組件間的耦合 2. Intent提供通用的消息系統,它允許在組件與組件間傳遞Intent來執行動作和產生事件。 3. 使用Intent可以激活Android應用的三個核心組件:活動、服務和廣播接收器。 4. Intent可以劃分成顯式意圖和隱式意圖。 5. 顯式意圖:調用Intent.setComponent()或Intent.setClass()方法指定了組件名或類對象的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。 6. 隱式意圖:沒有調用Intent.setComponent()或Intent.setClass()方法指定組件名或類對象的Intent為隱式意圖。 Android會根據intent-filter中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。Intent Filter(過濾器)其實就是用來匹配隱式Intent的。想要接收使用startActivity()方法傳遞的隱式意圖的活動必須在它們的意圖過濾器中包含"android.intent.category.DEFAULT" (簡單舉個例子,我意圖打劫,所以意圖就是那么一回事) ![](https://box.kancloud.cn/2016-05-21_573fc2ea89754.png) ### 2.4 Bundle類的作用 ### Bundle類用作攜帶數據,它類似于Map,用于存放key-value名值對形式的值。相對于Map,它提供了各種常用類型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle對象放入數據,getXxx()方法用于從Bundle對象里獲取數據。Bundle的內部實際上是使用了HashMap<String, Object>類型的變量來存放putXxx()方法放入的值: ``` public final class Bundle implements Parcelable, Cloneable { ...... Map<String, Object> mMap; public Bundle() { mMap = new HashMap<String, Object>(); ...... } public void putString(String key, String value) { mMap.put(key, value); } public String getString(String key) { Object o = mMap.get(key); return (String) o; ........//類型轉換失敗后會返回null,這里省略了類型轉換失敗后的處理代碼 } } ``` 在調用Bundle對象的getXxx()方法時,方法內部會從該變量中獲取數據,然后對數據進行類型轉換,轉換成什么類型由方法的Xxx決定,getXxx()方法會把轉換后的值返回。 ### 2.5 回顧helloandroid 看看安卓程序是怎么運作的 ### 為什么到了這里我們才講android應用是怎么運作的呢?到了這里我們已經初步了解activity,和intent,和Bundle了! 首先我們知道java是從Main進入程序的,那么android是怎樣進入程序的呢?細心的朋友或許已經知道了, AndroidManifest.xml,就是我們程序的入口了.在2.1節里面,有這樣的一幅圖 ![](https://box.kancloud.cn/2016-05-21_573fc2eaa81af.png) 包名是我們創建目錄的包名,包名下面是版本號,&lt;application&gt;標簽里注冊了圖標,標題名,還有activity,@是標準格式,在R里邊會有唯一的一個ID,比如XML是用來布局的,那么在R里則會生成一個對應的ID,&lt;intent-filter&gt;標簽監聽器,監聽activity第一個打開 ![](https://box.kancloud.cn/2016-05-21_573fc2eacb3e1.png) 那么我們就可以去看看MainActivity了 ![](https://box.kancloud.cn/2016-05-21_573fc2eb0292a.png) 首先我們看看是不是有activity的onCreate啊!上面說,不論如何都要先執行它,然后傳進來一個Bundle類型的值,然后又調用自身這個類!底層代碼已經幫我們實現好了,我們只需要用就行了.然后setContentView是得到內容視圖,得到那個視圖呢?剛剛我們不是說了嗎,注冊一個XML就會有一個R值.獲取到activity_main這個視圖 那么我們來看看布局文件xml里是什么, ![](https://box.kancloud.cn/2016-05-21_573fc2eb1faf9.png) 里面就一個文本框,字符串是找strings里邊的一個字符串 ![](https://box.kancloud.cn/2016-05-21_573fc2eb3c04e.png) 所以我們創建helloandroid的時候,看到的就是hello world了! 在此我們了解完了android的運作過程,那么我們來寫第二個程序吧! ### 2.6 寫第二個程序ActivityLifeCycle ### 按照創建helloandroid程序的方法創建一個activityLifeCycle的項目 然后點擊包右鍵新建一個類 **為應用添加新的Activity** 第一步:新建一個繼承Activity的類,如:NewActivity ``` public class NewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //這里可以使用setContentView(R.layout.xxx)顯示某個視圖.... } } ``` 第二步:需要在功能清單AndroidManifest.xml文件中添加進上面Activity配置代碼(紅色部分): ``` <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=“com.lxt008" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> ..... <activity android:name=".NewActivity" android:label="新activity的頁面標題"/> </application> ... </manifest> ``` android:name屬性值的前面加了一個點表示NewActivity是當前包com.lxt008下的類,如果類在應用的當前包下,可以省略點符號,如果類在應用的子包下必須加點,如:NewActivity類在com.lxt008.user包下可以這樣寫:&lt;activity android:name=“.user.NewActivity“ /&gt; 這里說明一下onCreate是怎么弄出來的! ![](https://box.kancloud.cn/2016-05-21_573fc2eb521de.png) ![](https://box.kancloud.cn/2016-05-21_573fc2eb74433.png) 在前面打勾按下OK **打開新的Activity,不傳遞參數** 在一個Activity中可以使用系統提供的startActivity(Intent intent)方法打開新的Activity,在打開新的Activity前,你可以決定是否為新的Activity傳遞參數: 第一種:打開新的Activity,不傳遞參數 ``` public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ....... Button button =(Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ //點擊該按鈕會打開一個新的Activity public void onClick(View v) { //新建一個顯式意圖,第一個參數為當前Activity類對象 //第二個參數為你要打開的Activity類 startActivity(new Intent(MainActivity.this, NewActivity.class)); }}); } } ``` 上面定義了一個按鈕,findViewById是根據ID找到視圖,R.id.button那么你的XML是不是要添加一個按鈕啊?在最新版的ADT21中,我們可以輕松的布局了,在ADT8中拖動控件還是很麻煩的 學過java的都會問,為什么不直接NEW一個按鈕啊,那么麻煩,android這樣是為了降低耦合度,高內聚,低耦合. ![](https://box.kancloud.cn/2016-05-21_573fc2eb8ad19.png) 當讓你也可以再xml里自己寫控件 我們再回過頭來看button. setOnClickListener(new OnClickListener(){ }) 這里的setOnClickListener是放置一個點擊監聽器里邊有new了一個內部類 為什么要這樣寫?當讓你也可以不這樣寫,這樣寫是為了方便,學過java的應該都知道吧!你另外寫一個類,然后再調用它也可以. **實現OnClickListener接口自動實現onClick方法** ![](https://box.kancloud.cn/2016-05-21_573fc2ebb2590.png) 這句可以分開來寫 ``` Intent intent=new Intent(); intent.setClass(MainActivity.this, NewActivity.class); startActivity(intent); ``` 剛剛我們學了意圖,意圖是活動之間傳遞信息的信使,第一個參數是自身的一個活動,第二個是要轉過去的活動. **使用過濾器: 如何弄出LoCat** ![](https://box.kancloud.cn/2016-05-21_573fc2ebc878a.png) 快捷欄里沒有的話到Other里邊找 ![](https://box.kancloud.cn/2016-05-21_573fc2ebec0a9.png) 相信學過java的對輸出語句并不陌生,點擊上面綠色的那個加號就是添加過濾器的,by log level 是日志類型,如上圖右邊的箭頭,從上到下有所有日志,捉蟲日志,信息日志,警告日志,錯誤日志… **設置syso過濾器** Syso的記錄日志我覺得沒那么亂,容易看出來,單獨顯示出來的,all 是所有信息 ![](https://box.kancloud.cn/2016-05-21_573fc2ec132f1.png) ![](https://box.kancloud.cn/2016-05-21_573fc2ec28ca3.png) (詳情請參考demo, ActivityLifeCycle) **打開新的Activity,傳遞參數給它** 第二種:打開新的Activity,并傳遞若干個參數給它: ``` public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ....... button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { Intent intent = new Intent(MainActivity.this, NewActivity.class) Bundle bundle = new Bundle();//該類用作攜帶數據 bundle.putString("name", "lxt008"); bundle.putInt("age", 80); intent.putExtras(bundle);//附帶上額外的數據 startActivity(intent); }}); } } ``` 在新的Activity中接收前面Activity傳遞過來的參數: ``` public class NewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ........ Bundle bundle = this.getIntent().getExtras(); String name = bundle.getString("name"); int age = bundle.getInt("age"); }} ```` **得到新Activity關閉后返回的數據** 如果你想在Activity中得到新打開Activity 關閉后返回的數據,你需要使用系統提供的startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,新的Activity 關閉后會向前面的Activity 傳回數據,為了得到傳回的數據,你必須在前面的Activity中重寫onActivityResult(int requestCode, int resultCode, Intent data)方法: ``` public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ....... Button button =(Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){//點擊該按鈕會打開一個新的Activity public void onClick(View v) { //第二個參數為請求碼,可以根據業務需求自己編號 startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); }}); } //第一個參數為請求碼,即調用startActivityForResult()傳遞過去的值 //第二個參數為結果碼,結果碼用于標識返回數據來自哪個新Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String result = data.getExtras().getString(“result”));//得到新Activity 關閉后返回的數據 } } ``` 當新Activity關閉后,新Activity返回的數據通過Intent進行傳遞,android平臺會調用前面Activity 的onActivityResult()方法,把存放了返回數據的Intent作為第三個輸入參數傳入,在onActivityResult()方法中使用第三個輸入參數可以取出新Activity返回的數據。 使用startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,新Activity關閉前需要向前面的Activity返回數據需要使用系統提供的setResult(int resultCode, Intent data)方法實現: ``` public class NewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ...... button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { Intent intent = new Intent();//數據是使用Intent返回 intent.putExtra(“result”, “success”);//把返回數據存入Intent NewActivity.this.setResult(RESULT_OK, intent);//設置返回數據 NewActivity.this.finish();//關閉Activity }}); } } ``` setResult()方法的第一個參數值可以根據業務需要自己定義,上面代碼中使用到的RESULT_OK是系統Activity類定義的一個常量,值為-1,代碼片斷如下: ``` public class android.app.Activity extends ......{ public static final int RESULT_CANCELED = 0; public static final int RESULT_OK = -1; public static final int RESULT_FIRST_USER = 1; } ``` **請求碼的作用** 使用startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,我們需要為startActivityForResult()方法傳入一個請求碼(第二個參數)。請求碼的值是根據業務需要由自已設定,用于標識請求來源。例如:一個Activity有兩個按鈕,點擊這兩個按鈕都會打開同一個Activity,不管是那個按鈕打開新Activity,當這個新Activity關閉后,系統都會調用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那個按鈕打開的,并且要做出相應的業務處理,這時可以這樣做: ``` @Override public void onCreate(Bundle savedInstanceState) { .... button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); }}); button2.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2); }}); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case 1: //來自按鈕1的請求,作相應業務處理 case 2: //來自按鈕2的請求,作相應業務處理 } } } ``` **結果碼的作用** 在一個Activity中,可能會使用startActivityForResult()方法打開多個不同的Activity處理不同的業務,當這些新Activity關閉后,系統都會調用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。為了知道返回的數據來自于哪個新Activity,在onActivityResult()方法中可以這樣做(ResultActivity和NewActivity為要打開的新Activity): ``` public class ResultActivity extends Activity { ..... ResultActivity.this.setResult(1, intent); ResultActivity.this.finish(); } public class NewActivity extends Activity { ...... NewActivity.this.setResult(2, intent); NewActivity.this.finish(); } public class MainActivity extends Activity { // 在該Activity會打開ResultActivity和NewActivity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case 1: // ResultActivity的返回數據 case 2: // NewActivity的返回數據 } } } ``` **源代碼下載** [(詳情請參考demo, ActivityIntentDemo)](http://www.apkbus.com/android-83166-1-1.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看