編輯:關於Android編程
1.Android程序的基本組織結構:
1)src: src目錄是放置我們所有Java代碼的地方
2)gen: 自動生成的,主要有R.java,項目中添加的任何資源都會在其中生成一個相應的資源id。(注意不要手動修改)
3)assets:用的不多,主要存放隨程序打包的文件,程序在運行的時候可以動態讀取這些文件內容。
4)bin:主要包含編譯時產生的文件,其中有一個編譯好的apk文件。
5)libs:主要包含第三方jar包
6)res:資源文件夾,項目中使用到的所有圖片、布局、字符串等資源都要存放在這個目錄下,,前面提到的R.java中的內容也是根據這個目錄下的文件自動生成的。當然這個目錄下還有很多的子目錄,圖片放在drawable目錄下,布局放在layout目錄下,字符串放在values目錄下。
7)AndroidManifest.xml: 整個Android項目的配置文件,你在程序中定義的所有四大組件都需要在這個文件裡注冊。另外還可以在這個文件中給應用程序添加權限聲明,也可以重新指定你創建項目時指定的程序最低兼容版本和目標版本。
8)project.properties:通過一行代碼指定了編譯程序時所使用的SDK版本。
2.Android日志工具LogCat: Log.v(); Log.d(); Log.i();Log.w(); Log.e();依次分別為:verbose,debug, information, warning, error。另外,還可以為log工具添加過濾器。
Activity:
1.如果你需要在XML中引用一個id,就使用@id/id_name這種語法,而如果你需要在XML中定義一個id,則要使用@+id/id_name這種語法。
2.創建活動的步驟:
1)新建活動類,繼承自Activity
2)添加xml布局文件
3)活動注冊:所有活動必須在AndroidManifest.xml中注冊,給主活動指定的label不僅會成為標題欄中的內容,還會成為啟動器(Launcher)中應用程序顯示的名稱。之後在標簽的內部我們加入了
3.隱藏標題欄:requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活動中顯示標題欄,注意這句代碼一定要在setContentView()之前執行,不然會報錯
4.在活動中使用Toast:Android系統提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶,在一段時間後自動消失。findViewById()方法返回的是一個View對象,我們需要向下轉型將它轉成Button對象。
5.在活動中使用menu:
1)在res中添加menu資源
2)在活動中重寫onCreateOptionsMenu()方法
3)響應菜單事件:重寫onOptionsItemSelected()方法
6.銷毀一個活動:利用Activity中的finish()方法
7.Intent是android程序中個組件之間進行交互的重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啟動活動、啟動服務、以及發送廣播等場景。顯式intent:
1)Intent(Context packageContext, Classcls) 這個構造函數接收兩個參數,第一個參數Context要求提供一個啟動活動的上下文,第二個參數Class則是指定想要啟動的目標活動。
2)Activity類中提供了一個startActivity()方法,這個方法是專門用於啟動活動的,它接收一個Intent參數
8.隱式Intent:它並不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的action和category等信息。只有和
9.使用隱式Intent,我們不僅可以啟動自己程序內的活動,還可以啟動其他程序的活動,這使得Android多個應用程序之間的功能共享成為了可能。Intentintent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));setData()接收一個Uri對象,主要用於指定當前Intent正在操作的數據,而這些數據通常都是以字符串的形式傳入到Uri.parse()方法中解析產生的。
10.向下一個活動傳遞數據:在啟動活動時傳遞數據的思路很簡單,Intent中提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啟動了另一個活動後,只需要把這些數據再從Intent中取出就可以了。
11.返回數據給上一個活動:
1)Activity中還有一個startActivityForResult(intent, 1)方法也是用於啟動活動的,但這個方法期望在活動銷毀的時候能夠返回一個結果給上一個活動。請求碼只要是一個唯一值就可以了,這裡傳入了1。
2)緊接著把要傳遞的數據存放在Intent中,然後調用了setResult()方法,是專門用於向上一個活動返回數據的。setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般只使用RESULT_OK或RESULT_CANCELED這兩個值,第二個參數則是把帶有數據的Intent傳遞回去。
3)使用startActivityForResult()方法來啟動SecondActivity的,在SecondActivity被銷毀之後會回調上一個活動的onActivityResult()方法,因此我們需要在FirstActivity中重寫這個方法來得到返回的數據。onActivityResult()方法帶有三個參數,第一個參數requestCode,即我們在啟動活動時傳入的請求碼。第二個參數resultCode,即我們在返回數據時傳入的處理結果。第三個參數data,即攜帶著返回數據的Intent。
4)如果用戶不是通過按鈕來返回activity,而是通過back鍵回到FirstActivity,可以通過重寫onBackPressed()方法來解決這個問題。
12.活動返回棧:Android是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裡的活動的集合,這個棧也被稱作返回棧(BackStack)。每當我們按下Back鍵或調用finish()方法去銷毀一個活動時,處於棧頂的活動會出棧。
13.活動的狀態:每個活動在生命周期中最多可能會有四種狀態:
1)運行狀態:當一個活動位於返回棧的棧頂時,活動處於運行狀態
2)暫停狀態:當一個活動不再處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態,處於暫停狀態的活動仍然是完全存活著的
3)停止狀態:當一個活動不再處於棧頂位置,並且完全不可見的時候,就進入了停止狀態。
4)銷毀狀態:當一個活動從返回棧中移除後就變成了銷毀狀態
14.活動的生存期:
1)完整生存期:活動在onCreate()方法和onDestroy()方法之間所經歷的,就是完整生存期
2)可見生存期:活動在onStart()方法和onStop()方法之間所經歷的,就是可見生存期。在可見生存期內,活動對於用戶總是可見的,即便有可能無法和用戶進行交互
3)前台生存期:活動在onResume()方法和onPause()方法之間所經歷的,就是前台生存期。在前台生存期內,活動總是處於運行狀態的,此時的活動是可以和用戶進行相互的
15.返回時活動已被回收:其實還是會正常顯示活動A的,只不過這時並不會執行onRestart()方法,而是會執行活動A的onCreate()方法,因為活動A在這種情況下會被重新創建一次。
1)Activity中還提供了一個onSaveInstanceState()回調方法,這個方法會保證一定在活動被回收之前調用,因此我們可以通過這個方法來解決活動被回收時臨時數據得不到保存到的問題。
2)在onCreate()方法中把Bundle中的數據取出來
16.Intent還可以結合Bundle一起用於傳遞數據的,首先可以把需要傳遞的數據都保存在Bundle對象中,然後再將Bundle對象存放在Intent裡。到了目標活動之後先從Intent中取出Bundle,再從Bundle中一一取出數據。
17.活動的啟動模式(可以在androidManifest.xml中修改android:launchMode="singleTop"):
1)standard是活動默認的啟動模式,在該模式下,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會創建該活動的一個新的實例。它就會在返回棧中入棧,並處於棧頂的位置。
2)singleTop模式,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再創建新的活動實例。
3) singleTask模式,每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,並把在這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。
4)singleInstance模式,式,指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動(其實如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧)
18.List是一個接口,而ListArray是一個類ListArray繼承並實現了List。所以List不能被構造,但可以向上面那樣為List創建一個引用,而ListArray就可以被構造。為什麼要用List list = new ArrayList() ,而不用ArrayList alist = new ArrayList()呢?問題就在於List有多個實現類,現在你用的是ArrayList,也許哪一天你需要換成其它的實現類,如LinkedList或者Vector等等。
19.隨時隨地退出程序:新建一個ActivityCollector類作為活動管理器,在活動管理器中,我們通過一個List來暫存活動,然後提供了一個addActivity()方法用於向List中添加一個活動,提供了一個removeActivity()方法用於從List中移除活動,最後提供了一個finishAll()方法用於將List中存儲的活動全部都銷毀掉。
20.活動的最佳啟動方法:
1)在SecondActivity中添加了一個actionStart()方法
publicstatic void actionStart(Context context, String data1, String data2) {
Intentintent = new Intent(context, SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
2)在FristActivity中:SecondActivity.actionStart(FirstActivity.this,"data1", "data2");
在上一篇博文中,我們搭建好了Android ndk 的開發環境,作為碼農,我們是不是先來寫一個HelloWorld來表示一下自己的到來。(1)首先在你的工作空間建一個An
注:原理講解可能會用到rx1.0的概念,但是代碼示例部分用rx2.0 來展示引言很多做android開發朋友對rxjava都有熟悉,github上也出現了很多的基於rx
前一段時間在做項目的時候遇到了一個問題,美工在設計的時候設計的是一個iPhone中的開關,但是都知道Android中的Switch開關和IOS中的不同,這樣就需要通過動畫
實現思路:該View是通過ListView實現的,通過實體兩個字段內容content和時間time來展示每個ListItem時間軸是使用上面一條線(20dp)