android動態表單
① 如何構建Android MVVM 應用框架
我們先來看看什麼是MVVM,然後再一步一步來設計整個MVVM框架。
MVC、MVP、MVVM
首先,我們先大致了解下Android開發中常見的模式。
MVC
View:XML布局文件。
Model:實體模型(數據的獲取、存儲、數據狀態變化)。
Controllor:對應於Activity,處理數據、業務和UI。
從上面這個結構來看,Android本身的設計還是符合MVC架構的,但是Android中純粹作為View的XML視圖功能太弱,我們大量處理View的邏輯只能寫在Activity中,這樣Activity就充當了View和Controller兩個角色,直接導致Activity中的代碼大爆炸。相信大多數Android開發者都遇到過一個Acitivty數以千行的代碼情況吧!所以,更貼切的說法是,這個MVC結構最終其實只是一個Model-View(Activity:View&Controller)的結構。
MVP
View:對應於Activity和XML,負責View的繪制以及與用戶的交互。
Model:依然是實體模型。
Presenter:負責完成View與Model間的交互和業務邏輯。
前面我們說,Activity充當了View和Controller兩個角色,MVP就能很好地解決這個問題,其核心理念是通過一個抽象的View介面(不是真正的View層)將Presenter與真正的View層進行解耦。Persenter持有該View介面,對該介面進行操作,而不是直接操作View層。這樣就可以把視圖操作和業務邏輯解耦,從而讓Activity成為真正的View層。
但MVP也存在一些弊端:
Presenter(以下簡稱P)層與View(以下簡稱V)層是通過介面進行交互的,介面粒度不好控制。粒度太小,就會存在大量介面的情況,使代碼太過碎版化;粒度太大,解耦效果不好。同時對於UI的輸入和數據的變化,需要手動調用V層或者P層相關的介面,相對來說缺乏自動性、監聽性。如果數據的變化能自動響應到UI、UI的輸入能自動更新到數據,那該多好!
MVP是以UI為驅動的模型,更新UI都需要保證能獲取到控制項的引用,同時更新UI的時候要考慮當前是否是UI線程,也要考慮Activity的生命周期(是否已經銷毀等)。
MVP是以UI和事件為驅動的傳統模型,數據都是被動地通過UI控制項做展示,但是由於數據的時變性,我們更希望數據能轉被動為主動,希望數據能更有活性,由數據來驅動UI。
V層與P層還是有一定的耦合度。一旦V層某個UI元素更改,那麼對應的介面就必須得改,數據如何映射到UI上、事件監聽介面這些都需要轉變,牽一發而動全身。如果這一層也能解耦就更好了。
復雜的業務同時也可能會導致P層太大,代碼臃腫的問題依然不能解決。
MVVM
View:對應於Activity和XML,負責View的繪制以及與用戶交互。
Model:實體模型。
ViewModel:負責完成View與Model間的交互,負責業務邏輯。
MVVM的目標和思想與MVP類似,利用數據綁定(Data Binding)、依賴屬性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一個更加靈活高效的架構。
數據驅動
在常規的開發模式中,數據變化需要更新UI的時候,需要先獲取UI控制項的引用,然後再更新UI。獲取用戶的輸入和操作也需要通過UI控制項的引用。在MVVM中,這些都是通過數據驅動來自動完成的,數據變化後會自動更新UI,UI的改變也能自動反饋到數據層,數據成為主導因素。這樣MVVM層在業務邏輯處理中只要關心數據,不需要直接和UI打交道,在業務處理過程中簡單方便很多。
低耦合度
MVVM模式中,數據是獨立於UI的。
數據和業務邏輯處於一個獨立的ViewModel中,ViewModel只需要關注數據和業務邏輯,不需要和UI或者控制項打交道。UI想怎麼處理數據都由UI自己決定,ViewModel不涉及任何和UI相關的事,也不持有UI控制項的引用。即便是控制項改變了(比如:TextView換成EditText),ViewModel也幾乎不需要更改任何代碼。它非常完美的解耦了View層和ViewModel,解決了上面我們所說的MVP的痛點。
更新UI
在MVVM中,數據發生變化後,我們在工作線程直接修改(在數據是線程安全的情況下)ViewModel的數據即可,不用再考慮要切到主線程更新UI了,這些事情相關框架都幫我們做了。
團隊協作
MVVM的分工是非常明顯的,由於View和ViewModel之間是鬆散耦合的:一個是處理業務和數據、一個是專門的UI處理。所以,完全由兩個人分工來做,一個做UI(XML和Activity)一個寫ViewModel,效率更高。
可復用性
一個ViewModel可以復用到多個View中。同樣的一份數據,可以提供給不同的UI去做展示。對於版本迭代中頻繁的UI改動,更新或新增一套View即可。如果想在UI上做A/B Testing,那MVVM是你不二選擇。
單元測試
有些同學一看到單元測試,可能腦袋都大。是啊,寫成一團漿糊的代碼怎麼可能做單元測試?如果你們以代碼太爛無法寫單元測試而逃避,那可真是不好的消息了。這時候,你需要MVVM來拯救。
我們前面說過了,ViewModel層做的事是數據處理和業務邏輯,View層中關注的是UI,兩者完全沒有依賴。不管是UI的單元測試還是業務邏輯的單元測試,都是低耦合的。在MVVM中數據是直接綁定到UI控制項上的(部分數據是可以直接反映出UI上的內容),那麼我們就可以直接通過修改綁定的數據源來間接做一些Android UI上的測試。
通過上面的簡述以及模式的對比,我們可以發現MVVM的優勢還是非常明顯的。雖然目前Android開發中可能真正在使用MVVM的很少,但是值得我們去做一些探討和調研。
如何構建MVVM應用框架
如何分工
構建MVVM框架首先要具體了解各個模塊的分工。接下來我們來講解View、ViewModel、Model它們各自的職責所在。
View
View層做的就是和UI相關的工作,我們只在XML、Activity和Fragment寫View層的代碼,View層不做和業務相關的事,也就是我們在Activity不寫業務邏輯和業務數據相關的代碼,更新UI通過數據綁定實現,盡量在ViewModel裡面做(更新綁定的數據源即可),Activity要做的事就是初始化一些控制項(如控制項的顏色,添加RecyclerView的分割線),View層可以提供更新UI的介面(但是我們更傾向所有的UI元素都是通過數據來驅動更改UI),View層可以處理事件(但是我們更希望UI事件通過Command來綁定)。 簡單地說:View層不做任何業務邏輯、不涉及操作數據、不處理數據,UI和數據嚴格的分開。
ViewModel
ViewModel層做的事情剛好和View層相反,ViewModel只做和業務邏輯和業務數據相關的事,不做任何和UI相關的事情,ViewModel 層不會持有任何控制項的引用,更不會在ViewModel中通過UI控制項的引用去做更新UI的事情。ViewModel就是專注於業務的邏輯處理,做的事情也都只是對數據的操作(這些數據綁定在相應的控制項上會自動去更改UI)。同時DataBinding框架已經支持雙向綁定,讓我們可以通過雙向綁定獲取View層反饋給ViewModel層的數據,並對這些數據上進行操作。關於對UI控制項事件的處理,我們也希望能把這些事件處理綁定到控制項上,並把這些事件的處理統一化,為此我們通過BindingAdapter對一些常用的事件做了封裝,把一個個事件封裝成一個個Command,對於每個事件我們用一個ReplyCommand 去處理就行了,ReplyCommand 會把你可能需要的數據帶給你,這使得我們在Vie,具體見 MVVM Light Toolkit 使用指南的 Command 部分 。再強調一遍:ViewModel 不做和UI相關的事。
Model
Model層最大的特點是被賦予了數據獲取的職責,與我們平常Model層只定義實體對象的行為截然不同。實例中,數據的獲取、存儲、數據狀態變化都是Model層的任務。Model包括實體模型(Bean)、Retrofit的Service ,獲取網路數據介面,本地存儲(增刪改查)介面,數據變化監聽等。Model提供數據獲取介面供ViewModel調用,經數據轉換和操作並最終映射綁定到View層某個UI元素的屬性上。
如何協作
關於協作,我們先來看下面的一張圖:
上圖反應了MVVM框架中各個模塊的聯系和數據流的走向,我們從每個模塊一一拆分來看。那麼我們重點就是下面的三個協作。
ViewModel與View的協作 。
ViewModel與Model的協作 。
ViewModel與ViewModel的協作 。
ViewModel與View的協作
圖2中ViewModel和View是通過綁定的方式連接在一起的,綁定分成兩種:一種是數據綁定,一種是命令綁定。數據的綁定DataBinding已經提供好了,簡單地定義一些ObservableField就能把數據和控制項綁定在一起了(如TextView的text屬性),但是DataBinding框架提供的不夠全面,比如說如何讓一個URL綁定到一個ImageView,讓這個ImageView能自動去載入url指定的圖片,如何把數據源和布局模板綁定到一個ListView,讓ListView可以不需要去寫Adapter和ViewHolder相關的東西?這些就需要我們做一些工作和簡單的封裝。MVVM Light Toolkit 已經幫我們做了一部分的工作,關於事件綁定也是一樣,MVVM Light Toolkit 做了簡單的封裝,對於每個事件我們用一個ReplyCommand去處理就行了,ReplyCommand 會把可能需要的數據帶給你,這樣我們處理事件的時候也只關心處理數據就行了.
由 圖 1 中ViewModel的模塊中我們可以看出ViewModel類下面一般包含下面5個部分:
Context (上下文)
Model (數據源 java Bean)
Data Field (數據綁定)
Command (命令綁定)
Child ViewModel (子ViewModel)
我們先來看下示例代碼,然後再一一講解5個部分是幹嘛用的:
//context
private Activity context;
//model(數據源 Java Bean)
private NewsService.News news;
private TopNewsService.News topNews;
//數據綁定,綁定到UI的欄位(data field)
public final ObservableField<String> imageUrl = new ObservableField<>();
public final ObservableField<String> html = new ObservableField<>();
public final ObservableField<String> title = new ObservableField<>();
// 一個變數包含了所有關於View Style 相關的欄位
public final ViewStyle viewStyle = new ViewStyle();
//命令綁定(command)
public final ReplyCommand onRefreshCommand = new ReplyCommand<>(() -> {
})
public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {
});
//Child ViewModel
public final ObservableList<NewItemViewModel> itemViewModel = new ObservableArrayList<>();
/** * ViewStyle 關於控制項的一些屬性和業務數據無關的Style 可以做一個包裹,這樣代碼比較美觀,
ViewModel 頁面也不會有太多太雜的欄位。 **/
public static class ViewStyle {
public final ObservableBoolean isRefreshing = new ObservableBoolean(true);
public final ObservableBoolean progressRefreshing = new ObservableBoolean(true);
}
Context
Context是幹嘛用的呢,為什麼每個ViewModel都最好需要持了一個Context的引用呢?ViewModel不處理和UI相關的事也不操作控制項,更不更新UI,那為什麼要有Context呢?原因
Model是什麼呢?其實就是數據源,可以簡單理解是我們用JSON轉過來的Bean。ViewModel要把數據映射到UI中可能需要大量對Model的數據拷貝和操作,拿Model的欄位去生成對應的ObservableField然後綁定到UI(我們不會直接拿Model的數據去做綁定展示),這里是有必要在一個ViewModel保留原始的Model引用,這對於我們是非常有用的,因為可能用戶的某些操作和輸入需要我們去改變數據源,可能我們需要把一個Bean在列表頁點擊後傳給詳情頁,可能我們需要把這個Model當做表單提交到伺服器。這些都需要我們的ViewModel持有相應的Model(數據源)。
Data Field(數據綁定)
Data Field就是需要綁定到控制項上的ObservableField欄位,這是ViewModel的必需品,這個沒有什麼好說。但是這邊有一個建議:
這些欄位是可以稍微做一下分類和包裹的。比如說可能一些欄位是綁定到控制項的一些Style屬性上(如長度、顏色、大小),對於這類針對View Style的的欄位可以聲明一個ViewStyle類包裹起來,這樣整個代碼邏輯會更清晰一些,不然ViewModel裡面可能欄位泛濫,不易管理和閱讀性較差。而對於其他一些欄位,比如說title、imageUrl、name這些屬於數據源類型的欄位,這些欄位也叫數據欄位,是和業務數據和邏輯息息相關的,這些欄位可以放在一塊。
Command(命令綁定)
Command(命令綁定)簡言之就是對事件的處理(下拉刷新、載入更多、點擊、滑動等事件處理)。我們之前處理事件是拿到UI控制項的引用,然後設置Listener,這些Listener其實就是Command。但是考慮到在一個ViewModel寫各種Listener並不美觀,可能實現一個Listener就需要實現多個方法,但是我們可能只想要其中一個有用的方法實現就好了。更重要一點是實現一個Listener可能需要寫一些UI邏輯才能最終獲取我們想要的。簡單舉個例子,比如你想要監聽ListView滑到最底部然後觸發載入更多的事件,這時候就要在ViewModel裡面寫一個OnScrollListener,然後在裡面的onScroll方法中做計算,計算什麼時候ListView滑動底部了。其實ViewModel的工作並不想去處理這些事件,它專注做的應該是業務邏輯和數據處理,如果有一個東西不需要你自己去計算是否滑到底部,而是在滑動底部自動觸發一個Command,同時把當前列表的總共的item數量返回給你,方便你通過 page=itemCount/LIMIT+1去計算出應該請求伺服器哪一頁的數據那該多好啊。MVVM Light Toolkit 幫你實現了這一點:
public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {
int page=itemCount/LIMIT+1;
loadData(page.LIMIT)
});
接著在XML布局文件中通過bind:onLoadMoreCommand綁定上去就行了。
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
bind:onLoadMoreCommand="@{viewModel.loadMoreCommand}"/>
x
當然Command並不是必須的,你完全可以依照自己的習慣和喜好在ViewModel寫Listener,不過使用Command可以使ViewModel更簡潔易讀。你也可以自己定義更多的、其他功能的Command,那麼ViewModel的事件處理都是託管ReplyCommand 來處理,這樣的代碼看起來會比較美觀和清晰。Command只是對UI事件的一層隔離UI層的封裝,在事件觸發時把ViewModel層可能需要的數據傳給ViewModel層,對事件的處理做了統一化,是否使用的話,還是看你個人喜好了。
Child ViewModel(子ViewModel)
子ViewModel的概念就是在ViewModel裡面嵌套其他的ViewModel,這種場景還是很常見的。比如說你一個Activity裡面有兩個Fragment,ViewModel是以業務劃分的,兩個Fragment做的業務不一樣,自然是由兩個ViewModel來處理,這時候Activity對應的ViewModel裡面可能包含了兩個Fragment各自的ViewModel,這就是嵌套的子ViewModel。還有另外一種就是對於AdapterView,如ListView RecyclerView、ViewPager等。
//Child ViewModelpublic final
ObservableList<ItemViewModel> itemViewModel = new ObservableArrayList<>();
它們的每個Item其實就對應於一個ViewModel,然後在當前的ViewModel通過ObservableList 持有引用(如上述代碼),這也是很常見的嵌套的子ViewModel。我們其實還建議,如果一個頁面業務非常復雜,不要把所有邏輯都寫在一個ViewModel,可以把頁面做業務劃分,把不同的業務放到不同的ViewModel,然後整合到一個總的ViewModel,這樣做起來可以使我們的代碼業務清晰、簡短意賅,也方便後人的維護。
總的來說,ViewModel和View之前僅僅只有綁定的關系,View層需要的屬性和事件處理都是在XML裡面綁定好了,ViewModel層不會去操作UI,只是根據業務要求處理數據,這些數據自動映射到View層控制項的屬性上。關於ViewModel類中包含哪些模塊和欄位,這個需要開發者自己去衡量,我們建議ViewModel不要引入太多的成員變數,成員變數最好只有上面的提到的5種(context、model……),能不引入其他類型的變數就盡量不要引進來,太多的成員變數對於整個代碼結構破壞很大,後面維護的人要時刻關心成員變數什麼時候被初始化、什麼時候被清掉、什麼時候被賦值或者改變,一個細節不小心可能就出現潛在的Bug。太多不清晰定義的成員變數又沒有注釋的代碼是很難維護的。
另外,我們會把UI控制項的屬性和事件都通過XML(如bind:text=@{...})綁定。如果一個業務邏輯要彈一個Dialog,但是你又不想在ViewModel裡面做彈窗的事(ViewModel不希望做UI相關的事)或者說改變ActionBar上面的圖標的顏色,改變ActionBar按鈕是否可點擊,這些都不是寫在XML裡面(都是用Java代碼初始化的),如何對這些控制項的屬性做綁定呢?我們先來看下代碼:
public class MainViewModel implements ViewModel {
....
//true的時候彈出Dialog,false的時候關掉dialog
public final ObservableBoolean isShowDialog = new ObservableBoolean();
....
.....
}
// 在View層做一個對isShowDialog改變的監聽
public class MainActivity extends RxBasePmsActivity {
private MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
.....
mainViewModel.isShowDialog.addOnPropertyChangedCallback(new android.databinding.Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(android.databinding.Observable sender, int propertyId) {
if (mainViewModel.isShowDialog.get()) {
dialog.show();
} else {
dialog.dismiss();
}
}
});
}
...
}
簡單地說你可以對任意的ObservableField做監聽,然後根據數據的變化做相應UI的改變,業務層ViewModel只要根據業務處理數據就行,以數據來驅動UI。
② 問答:Android P都更新了哪些功能
Android P的新功能特性集中在了UI、通知體驗、室內定位、圖像存儲幾個方面,解決了之前一直存在的痛點。例如WiFi RTT一定程度上彌補了蜂窩網路在室內環境下的定位問題,HEIC圖像格式則重點解決了存儲容量問題。同時,Android P也在通知豐富度及操作便捷性等功能方面有所增強和提升。
一、WiFi RTT功能——復雜地形精確導航
WiFi RTT功能是Android P新引入的一個功能,從原理上來說與蜂窩網路的定位原理一致,但這個功能極大的彌補了蜂窩網路在室內定位的短板,WiFi RTT將能夠在室內提供高精度的定位,這是蜂窩網路很難做到的。
WiFi RTT是全新的功能,在android.net.wifi包下增加了rtt包,用於存放WiFi RTT相關類和介面。
WiFi RTT的API以WifiRttManager為核心,藉助AP熱點或WiFi,利用RTT原理完成測距,通過三個以上的測距點就能夠准確地定位到設備所在位置。
WiFiRTTManager提供了測距介面,是一個非同步測距操作,根據官方文檔(https://developer.android.com/reference/android/net/wifi/rtt/WifiRttManager.html)說明,其測距介面如下:
void startRanging(RangingRequest request, RangingResultCallback callback, Handler handler);
註:SDK Platforms Android P Preview Revision 1的相關介面定義與此不同,但實際的官方鏡像中介面與此一致,開發者需要更新最新的Android P Preview Revision 2,此版本中Google已經修正該介面。
介面中,RangingRequest通過RangingRequest.Builder構建,RangingRequest.Builder構建出RangingRequest所需要的參數可以通過WiFiManager等系統服務獲取到相關的內容,如List<ScanResult> scanResults = wifiManager.getScanResults();
以下提供一個簡單的測試Demo,以供參考:
private WifiRttManager wifiRttManager;
private WifiManager wifiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ... ...
if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)) {
Object service = this.getApplicationContext().getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
if(service instanceof WifiRttManager) {
wifiRttManager= (WifiRttManager) service;
Log.i(TAG, "Get WifiRttManager Succ.");
}
wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
IntentFilter wifiFileter = new IntentFilter();
wifiFileter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
wifiFileter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
wifiFileter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(new WifiChangeReceiver(), wifiFileter);
}
// ... ...
}
private void startScanAPs() {
wifiManager.setWifiEnabled(true);
wifiManager.startScan();
}
class WifiChangeReceiver extends BroadcastReceiver {
@RequiresApi(api = 28)
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
List<ScanResult> scanResults = wifiManager.getScanResults();
Log.i(TAG, "Wifi Scan size:" + scanResults.size());
for(ScanResult scanResult: scanResults) {
Log.i(TAG, scanResult.toString());
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(scanResult);
wifiRttManager.startRanging(builder.build(), new RangingResultCallback() {
@SuppressLint("Override")
@Override
public void onRangingFailure(int i) {
// TODO
}
@SuppressLint("Override")
@Override
public void onRangingResults(List<RangingResult> list) {
// TODO get result from list
for(RangingResult result : list) {
Log.i(TAG, result.toString());
}
}
}, new Handler());
}
}
}
}
使用WiFi RTT時,需要在AndroidManifest.xml中增加如下聲明:
<uses-feature android:name="android.hardware.wifi.rtt" />
通過上面的簡單代碼,就能夠實現WiFi RTT的功能。
WiFi RTT功能適用於復雜地形的大型室內外場所,如商場、娛樂場所、大型休閑、游樂場等等,提供場所內的局部區域精確化導航等功能。相信在很快的時間內,就能夠在各大地圖應用內體驗到這項便利功能,對於路痴、地圖盲的夥伴們將是極大的福音。
二、顯示剪切——支持劉海屏
隨著iPhone X的推出,「劉海屏」達到了空前的高潮。Android P里提供了對異形屏幕的UI適配兼容方案,通過DisplayCutout類提供的相關介面,能夠獲取到屏幕中Cutout區域的信息。
藉助DisplayCutout,可以獲取到如下信息:
DisplayCutout displayCutout = view.getRootWindowInsets().getDisplayCutout();
if(displayCutout != null) {
Region bounds = displayCutout.getBounds();
Log.d(TAG, String.format("Bounds:%s", bounds.toString()));
int top = displayCutout.getSafeInsetTop();
int bottom = displayCutout.getSafeInsetBottom();
int left = displayCutout.getSafeInsetLeft();
int right = displayCutout.getSafeInsetRight();
Log.d(TAG, String.format("Cutout edge:[left:%d, top:%d,right:%d, bottom:%d]", left, top, right, bottom));
}
public Region getBounds()能夠獲取到Cutout區域的所有信息,Region就是Cutout區域。
public int getSafeInsetTop()
public int getSafeInsetBottom()
public int getSafeInsetLeft()
public int getSafeInsetRight()
以上四個介面,可以獲取到去除Cutout區域後的安全區域邊界值。
通過上述數據,開發者能夠精準的控制UI的繪制,避免將UI內容繪制到Cutout區域造成UI顯示異常。
Android機器里,劉海屏目前還是極為罕見的Google為了方便開發者調試,在Android P Preview鏡像中,特別提供了Cutout的支持,具體打開方式可以參考Google提供的特性說明文檔cutout小節內容。
cutout小節:https://developer.android.com/preview/features.html#cutout
如圖所示,筆者使用手頭的Pixel 2 XL體驗了Android P的Cutout設置。
三、通知優化——操作更多樣,內容更豐富
Android P在通知內容的豐富度和操作上做了優化。
最近的版本中,Android系統的通知管理方面一直優化升級,Android O提供了更細粒度的Channel功能,通知欄推送時需要指定NotificationChannel,用戶可以對通知的Channel選擇,只允許感興趣的Channel推送的通知顯示。通過通道設置、免打擾優化等方式,極大增強了消息體驗。
增強消息體驗
Android P繼續改進和增強消息通知[v1]。早在Android 7.0時,就提供了在通知中直接應答和輸入,Android P對這一功能做了更多的增強。
Android P的通知中支持圖像內容,可以通過setData()方法,給出消息的圖像內容,在通知上展示給用戶。
Android P同樣簡化了通知的配置形式。Android P中增加了Notification.Person類,用於區分同一個對話的參與者信息,如參與者的頭像、URI等。根據官方說明,Android P中,通知消息的其他一些API,也使用Person替代之前的CharSequence。
簡單的體驗下新的API的開發:
NotificationChannel channel = new NotificationChannel("WtTestChannel",
"WtTestChannel", NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(true); // luncher icon right corner's point
channel.setLightColor(Color.RED); // read point
channel.setShowBadge(true); // whether show this channel notification on long press icon
Notification.Builder builder =
new Notification.Builder(MainActivity.this,
"WtTestChannel");
Notification.Person p = new Notification.Person();
p.setName("WeTest");
p.setUri("http://cdn.wetest.qq.com/" +
"ui/1.2.0/pc/static/image/newLogo-16042.png");
Notification.MessagingStyle messageStyle = new Notification.MessagingStyle(p);
Notification.MessagingStyle.Message message =
new Notification.MessagingStyle.Message("WeTestMessage", 2000, p);
//show image
Uri image = Uri.parse(
"http://cdn.wetest.qq.com/ui/1.2.0/pc/static/image/newLogo-16042.png");
message.setData("image/png", image);
messageStyle.addMessage(message);
builder.setStyle(messageStyle);
builder.setSmallIcon(R.mipmap.ic_launcher);
Notification notification = builder.build();
NotificationManager notifyManager =
(NotificationManager) getSystemService(
MainActivity.this.getApplicationContext().NOTIFICATION_SERVICE);
notifyManager.createNotificationChannel(channel);
notifyManager.notify("WeTest", 1, notification);
通道設置、廣播和免打擾優化
Android P中,重點做了內容豐富上的工作,同時也對Channel的設置方面做了一些簡化處理。
Android O版本里,首次推出了NotificationChannel,開發者需要配置相應的Channel,才能夠推送通知給用戶。用戶能夠更加細粒度[v1]的針對App的Channel選擇,而不是禁止App的所有通知內容。
而在Android P中,對通知的管理做了進一步的優化,包括可以屏蔽通道組、提供新的廣播類型和新的免打擾優先順序。
屏蔽通道組:用戶可以在通知設置中屏蔽App的整個通道組。開發者可以通過isBlocked()來判斷某個通道組是否被屏蔽了,並根據結果,不向已經被屏蔽的通道組發送任何通知。另外,開發者可以在App中使用新介面getNotificationChannelGroup()來查詢當前的通道組設置。
新的廣播類型:新廣播類型是針對通道和通道組的功能增加的「通道(組)屏蔽狀態變化」廣播。開發者App中可以對所擁有的通道(組)接收廣播,並根據具體廣播內容作出動作。開發者可以通過NotificationManager,查看廣播相關的具體信息。針對廣播的動作可以通過Broadcasts查看具體的方法和信息。
免打擾優先順序:NotificationManager.Policy增加了兩個新的優先順序常量,PRIORITY_CATEGORY_ALARMS(警告優先),PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER(媒體、系統和游戲聲音優先)。
四、支持多攝像機和相機共享
近一段時間,雙攝、多攝等機型紛紛面世。雙攝及多攝提供了單攝像頭所無法完成的能力,如無縫縮放、散景和立體視覺。Android P在這方面也提供了系統級的API支持。
Android P提供了系統API,支持從兩個或者多個物理攝像頭同步獲取數據流。此前OEM廠商提供的雙攝設備多是廠商自行定製系統實現,此時Android P推出了API,從系統層面上制定了API規范。
新的API提供了在不同相機之間切換邏輯數據流或混合數據流的調用能力。在捕捉延遲方面,提供新的會話參數,降低初始捕捉延遲。同時,提供相機共享能力,以解決在多種使用相機的場景下重復停止、開啟相機流。閃光燈方面,Android P增加基於顯示的閃光燈支持。光學防抖方面,Android P向開發者提供OIS時間戳,用於圖像穩定性優化以及其他特效使用。
此外,Android P還支持外部USB/UVC相機,可以使用更強大的外置攝像頭模組。
五、支持圖像媒體後期處理
Android P引入了新的ImageDecoder,該類除了支持對各種圖片格式的解碼、縮放、裁剪之外,其強大之處在於支持對解碼後的圖像做後期處理(post-process),使用該功能可以添加復雜的自定義特效,比如圓角,或是將圖片放在圓形像框中。編寫後期處理回調函數,你可以添加任何繪圖指令實現需要的效果。
此外,Android P原生支持GIF和WebP格式的動圖,新增了AnimatedImageDrawable類,並被新增的解碼器類ImageDecoder直接支持,用法跟矢量動畫類AnimatedVectorDrawable類似,實現方式也類似,通過新增渲染線程和工作線程,不需要在UI線程處理動圖更新,可以說是無痛使用,非常省心。
下面通過編寫代碼,顯示一張gif圖,並利用後期處理機制,在圖像中間繪制一個綠色的實心圓。
final ImageView image = (ImageView) findViewById(R.id.image);
File gifFile = new File("/data/local/tmp/test.gif");
if (!gifFile.exists()) {
Log.d(TAG, "gifFile is not exsited!");
return;
}
ImageDecoder.Source source = ImageDecoder.createSource(gifFile);
try {
d = ImageDecoder.decodeDrawable(source, new ImageDecoder.OnHeaderDecodedListener() {
@Override
public void onHeaderDecoded(ImageDecoder imageDecoder, final ImageDecoder.ImageInfo imageInfo, ImageDecoder.Source source) {
imageDecoder.setPostProcessor(new PostProcessor() {
@Override
public int onPostProcess(Canvas canvas) {
int w = imageInfo.getSize().getWidth();
int h = imageInfo.getSize().getHeight();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(w/2, h/2, h/4, new Paint(paint));
return 0;
}
});
}
});
image.setVisibility(View.VISIBLE);
image.setImageDrawable(d);
} catch (IOException e){
Log.d(TAG, e.toString());
}
Button button = (Button) findViewById(R.id.buttonText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (d != null && d instanceof AnimatedImageDrawable) {
AnimatedImageDrawable ad = (AnimatedImageDrawable) d;
if (ad.isRunning()) {
Log.d(TAG, "stop running");
ad.stop();
} else {
Log.d(TAG, "start running");
ad.start();
}
}
}
});
六、支持HDR VP9和HEIF
Android P內置了對HDR VP9和HEIF(heic)圖像編碼的支持。HEIF是蘋果在iOS11推出的一種高效壓縮格式,目前在IphoneX、Iphone 8、IPhone 8P上已經支持。該格式的壓縮率更高,但是編碼該格式需要硬體的支持,解碼並不需要。最新的支持庫中的HeifWriter支持從YUV位元組緩沖區、Surface或是Bitmap類轉換為HEIF格式的靜態圖像。
Android P新引入了MediaPlayer2,支持DataSourceDesc創建的播放列表。
功能優化提升一覽
一、神經網路API 1.1
在前不久發布的Android 8.1 (API level 27)上,Google首次在Android平台上推出了神經網路API,這意味著我們的Android機器智能化水平又提高了一大步。而本次Android P,進一步豐富了神經網路的支持,不僅對之前的相關API進行了優化,並且提供了9個新的操作,為具體的數據操作方面提供了更深入的支持。
二、改進表單自動填充
Android 8.0(API等級26)中引入了自動填充框架,這使得在應用中填寫表單變得更加容易。 Android P引入了自動填充服務並實現了多項改進,得以在填寫表單時進一步增強用戶體驗。
三、安全增強
Android P引入了許多新的安全功能,包括統一的指紋驗證對話框和敏感交易的高確信度的用戶確認。應用程序內的指紋認證UI也將會更加一致。
統一的指紋驗證對話框
如果第三方APP想要使用指紋,Android系統框架為應用提供了指紋認證對話框,該功能可以提供統一的外觀和使用體驗,用戶使用起來更放心。如果您的程序還在使用FingerprintManager,現在改用FingerprintDialog替代吧,系統來提供對話框顯示。對了,在使用FingerprintDialog之前,別忘了調用hasSystemFeature()方法檢查手機設備是否支持指紋。
敏感交易的高確信度的用戶確認
Android P系統提供了受保護的確認API,藉助這組全新的API,應用可以使用ConfirmationDialog對話框向用戶提示,請求用戶批准一條簡短的聲明, 該聲明允許應用提醒用戶,即將完成一筆敏感交易,例如支付。
如果用戶接受聲明,應用將會收到一條key-hash的消息認證碼(HMAC),該簽名由TEE產生,以保護用於輸入和認證對話框的顯示。該簽名表示用於已經看到了聲明並同意了。
硬體安全模塊
Android P還提供了StrongBox Keymaster(強力沙盒秘鑰大師),一個存儲在硬體安全模塊的具體實現。在這個硬體安全模塊中有自己的CPU、安全存儲空間,真隨機數生成器,以及額外的機制抵禦應用被篡改或是未授權應用的惡意載入。當檢查存儲在StrongBox Keymaster中的密鑰時,系統通過可信執行環境(TEE)確認密鑰的完整性。為了降低能耗,StrongBox支持了一組演算法和不同長度的秘鑰:
●RSA 2048
●AES 128 and 256
●ECDSA P-256
●HMAC-SHA256 (支持8位元組到64位元組任意秘鑰長度)
●Triple DES 168
需要說明的是,這個機制需要硬體支持。
安全秘鑰導入KeyStore
使用新的ASN.1編碼的秘鑰格式添加導入秘鑰到Keystore,Android P提供了額外的密碼解密安全能力。之後KeyMaster就可以解密KeyStore存儲的秘鑰,這種工作方式使得秘鑰明文永遠不會出現在設備內存中。這項特性要求設備支持Keymaster 4。
四、支持客戶端側Android備份加密
Android P支持使用客戶端密鑰對Android備份進行加密。 這項隱私措施,需要設備的PIN、圖案密碼或標准密碼才能從用戶設備備份的數據中恢復數據。
五、Accessibility優化
為了使App使用更便捷,Android在多個方面為開發者提供了易用性的優化。
1、Navigation semantics
Android P在App的場景切換和操作上為開發者提供了很多的優化點。
2、Accessibility pane titles
Android P中對Section提供了新的機制,被稱為accessibility pane titles, Accessibility services能夠接收這些標題的變化,使得能夠對一些變化提供更加細粒度的信息。
指定Section的標題,可以通過android:accessibilityPaneTitle新屬性來設置,同樣運行時可以通過setAccessibilityPaneTitle()來設置標題。
3、頂部欄導航
Android P提供了新的頂部欄導航機制,通過設置View實例的android:accessibilityHeading屬性為true,來顯示邏輯標題。通過這些標題,用戶就可以從一個標題導航到下一個標題,
4、群組導航和輸出
針對屏幕閱讀器,Android P對View提供了新的屬性android:screenReaderFocusable代替原有的android:focusable來做標記,來解決在一些場景下為了使屏幕閱讀器工作而設置View為可獲取焦點的操作。這時,屏幕閱讀器需要同時關注android:screenReaderFocusable和android:focusable設置為ture的View。
5、便捷操作
tooltips交互
Android P中,可以使用getTooltipText()去讀取tooltips的文本內容。使用新的ACTION_SHOW_TOOLTIP和ACTION_HIDE_TOOLTIP控制View顯示或者隱藏tooltips。
新全局交互
Android P在AccessibilityService類中提供了兩個全新的操作。開發者的Service可以通過GLOBAL_ACTION_LOCK_SCREEN幫助用戶鎖屏,通過GLOBAL_ACTION_TAKE_SCREENSHOT幫助用戶完成屏幕截圖。
窗體改變的一些細節
Android P優化了在App多窗體同步發生變化時的更新內容獲取。當出現TYPE_WINDOWS_CHANGED時,開發者可以通過getWindowChanges()API獲取窗體變化情況。
當多窗體發生改變時,每個窗體都會發出自己的事件,開發者可以通過getSource()獲取到事件窗體的根View。
如果你的App為View定義了accessibility pane titles,UI更新時你的Service就能夠識別到相應的改動。當出現TYPE_WINDOW_STATE_CHANGED事件時,使用新方法 getContentChangeTypes()返回的類型,就能夠獲取到當前窗體的變化情況。例如,現在就能夠通過上述的機制,檢測到一個[v1]窗格是否有了新標題,或者一個窗格的消失。
六、新的Rotation方案
旋轉屏幕,是一些游戲、視頻等場景必要的操作,但有一些場景,用戶旋轉屏幕並不是為了讓應用顯示從豎屏變成橫屏或反過來。為了避免這種誤操作,Android P提供了新的機制,開發者可以指定屏幕不隨重力感應旋轉,而是用戶通過一個單獨的按鈕自行控制屏幕顯示轉向。
③ android怎麼把checkbox狀態設置為選中狀態
CheckBox和Button一樣,也是一種古老的控制項,它的優點在於,不用用戶去填寫具體的信息,只需輕輕點擊,缺點在於只有「是」和「否」兩種情況,但往往利用它的這個特性,來獲取用戶的一些信息。如一個身份表單中,常常讓用戶填寫「是否已經結婚」,顯然讓用戶去填寫「是」或「否」是不合理的,理想的情景是用如下控制項:
選中後的狀態:
建立checkBox的布局:
<CheckBox
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="已婚"
></CheckBox>
顯然,Checked屬性是CheckBox最重要的屬性之一,改變它的方式有三種:
1、XML中申明,在xml布局中指定默認的狀態android:checked="true"。
2、代碼動態改變,在Java中可以直接調用checkbox.setChecked(true);
3、用戶觸摸,即注冊OnCheckedChangeListener事件。
實例如下:
//獲取CheckBox實例
CheckBox
cb
=
(CheckBox)this.findViewById(R.id.cb);
//綁定事件
cb.setOnCheckedChangeListener(new
OnCheckedChangeListener()
{
@Override
public
void
onCheckedChanged(CompoundButton
arg0,
boolean
arg1)
{
//
TODO
Auto-generated
method
stub
Toast.makeText(MyActivity.this,
arg1?"選中了":"取消了選中"
,
Toast.LENGTH_LONG).show();
}
});
在開發當中,默認的狀態是未選中的,如果需要默認選中,通常是在xml中指定即可。
④ android實戰培訓課程
⑴ 安卓培訓主要學習哪兒些內容
每個人准備培訓情況和基礎都是不一樣的,但是看了你的問題之後覺得咱倆的情況還是很相似的,我是去年畢業的,當時我學的是計算機專業,當時在學校的時候開的各門的課程都是以理論基礎為主要的,我也不是說大學的教育不好,可是當時的課程一般都是教授級別的給我們講一般的模式就是老師講課在上面念PPT我們在下面拍照,等最後考試的時候老師直接給我們劃題答案背過基本這一年就這樣過去了,技術類的東西是真心沒學到,後來華清遠見到我們學校和我們學校合作,給我們弄得安卓方面的實訓課程,覺得自己欠缺的很多的,也是怕和你這種情況一樣找不到理想的工作,所以我就在華清遠見進行的安卓培訓,當時我們的學習內容主要有以下幾點,其實各種的培訓班的課程都是大同小異的老師屬於一部分的因素最關鍵的還是要靠自己的。
第一階段的課程一般都是Java編程開發,這一部分應該會和Java後台有相關聯的地方,但是比Java後台簡單,這一階段一般要學習Java語法和Java面向對象思想、Java數據結構及演算法、GUI界面編程、Java進程與線程、Java網路通信與流、設計模式、資料庫和Javaweb,安卓在這一階段的學習內容看似和後台關聯性很大,但是這一部分我們只學習後台一些基礎的東西和日後會用到的東西,我們要把基礎奠定好。
第二階段要學習的內容是安卓基礎開發,主要的課程內容為Android界面編程(界面編程是Android入門的核心技術,內容縱多,涉及四大組件之一Activity、Wedget、自定義View、事件處理、動畫處理、列表、圖片處理、國際化、資源文件、菜單、通知、對話框、Tools/ActionBar/Fragment、樣式/主題、Intent。)、進程與線程、服務與廣播、數據存儲、網路通信、多媒體以及硬體相關,這一階段更注重安卓入門基礎的培訓,一定要好好的把握。
接下來學習的內容是一個進階階段,主要學習的是安卓的高級開發,一般的課程內容為HOME開發、NDK開發等、地圖開發項目發布等等,以上就算是安卓培訓的所有學習內容,但是你掌握了學習內容之後還是遠遠不夠的,一般的培訓班都會給我們安排項目實戰的,這是一種思想的鍛煉,我們做什麼就要有什麼的思維做後台的有做後台的思維,做前端的有做前段的思維,我們學安卓的進行手機端APP開發的就要有安卓的思維,這一階段也是很重要的,就好比我們在華清遠見學完整體的內容之後也參與了一些項目的實戰。
我把每一階段要學習的課程都給你整理了,你可以現在有準備的去看一些基礎的視頻或者相關的書籍了。
⑵ 我想學習安卓開發,哪個培訓機構靠譜呢
沒什麼好與不好,建議對比師資選擇,管理團隊擁有平均10年以上IT培訓行業從業經驗,核心講師團隊由Mars、老羅、餅乾等移動互聯網傳奇名師領銜,以良知教學為本、責任心強,平均8年的執教經驗,在業內首屈一指,教學方面可以不用擔心。
⑶ 現在的安卓教育培訓是真的嗎
當然是真的,首先國內移動互聯時代是移動應用App的爆發式增長,人們的消費與使回用傾向正逐漸向移動答端轉移,這種趨勢就如同當初的互聯網一樣勢不可擋。從各項統計來看,現在App的大行其道,正慢慢的吞噬著軟體業。都說互聯網改變了我們的生活,不過短短的數年時間,帶來的卻是一整個屬於移動端的時代。
其次移動開發行業的人才供不應求,缺口逐漸加大,所以除了專業的開發者,也吸引了一大群嘗試擇業的在職者和優秀畢業生。與此同時,移動端的教育培訓缺口也被打開,一些經典的如Android開發培訓課程受到了學員們熱烈的追捧。
數據表明,當前Android已經佔到移動系統的80%以上。因而越來越多的應屆畢業生與在職者從原來的專業或職業中走出來,擁抱IT,擁抱移動互聯網這個朝氣蓬勃的產業。首選就是學Android開發,因而選擇好的線上或線下Android培訓機構就顯得極為重要。
最後好的Android開發培訓課程,必然來自好的Android開發培訓機構。尚矽谷教育通過全日制小班授課與項目實戰相結合的形式,全方位的服務學員,專注於移動互聯網領域高端課程的研發。
⑷ Android培訓課程有什麼內容
今後,業界將有兩種移動開發課程體系:一種是其他機構Android課程,一種是尚矽谷Android+HTML5混合開發課程。
尚矽谷Android課程全面升級為《Android+HTML5混合開發》,讓學員如虎添翼!在原Android課程基礎上加入HTML、CSS、JavaScript、React核心,React Native跨平台混合開發、豆瓣搜索項目實戰等H5前端技術。
當前,同時掌握「Android原生開發」+「H5跨平台開發」兩大核心技術的復合型移動開發人才嚴重供不應求,薪資節節攀升,就業及未來職業發展都極具競爭力。
⑸ 安卓系統 培訓 有什麼課題可以選
只要寫GUI開發就可以了,這本身就很深奧了。可以從以下著眼: 1.GUI框架 2.各個控鍵的重復使用 3.高擴展性 4.性能優化 可以參考一下《Java Swing ...
⑹ 安卓培訓多少錢,安卓培訓課程有哪些
Android培訓周期一般都是4個月,至於培訓費用大部分培訓機構的收費標准都不相上下,部分Android高端培訓費用會偏高一點,費用2W+。選擇Android培訓除了看培訓機構外也要看自身條件,適合參加什麼樣的培訓,例如普通還是高端,普通的Android培訓零基礎也可以,但高端Android培訓就需要計算機語言基礎了。
好程序員Android高端班課程,是一套涵蓋 Java 語言強化、Java Web 開發、Android 應用開發、Android 游戲開發的專業課程。本套課程真正圍繞Android知識體系制訂,絕非由Java EE課程、Java ME課程或者Symbian課程改造而成。每一階段課程涵蓋多個實戰項目,每個知識點均對應項目中實際功能,學習新知識的同時不斷向項目中添加新功能,獨特的教學方法幫助學員強化學習目標,迅速提升學習能力。致力於培養Android 高端開發人才,旨在培養真正的 Android 應用和游戲開發能力的高素質人才,學員畢業即具備行業前沿開發技術。
第一階段 Java面向對象高級編程——java編程語法進階
該階段課程重點講解了面向對象設計原則與設計模式;智能家居之遠程監控。
Java面向對象編程
1、面向對象設計原則
2、面向對象設計模式概要
3、面向對象設計模式a.創建型設計模式b.結構型設計模式c.行為模式4、數據結構與常用演算法
第二階段 高級JDK API開發技術 —— Java Web編程
該階段課程重點講解了JDK當中的高級API的使用方法,包括新的並發線程庫和反射機制。手機安全衛士
Java Web編程
1、並發線程庫介紹
2、線程本地變數的使用方法
3、信號量與可重入鎖
4、讀寫鎖的使用方法
5、阻塞隊列與同步 *** 庫使用方法
6、Java反射機制介紹
7、Class、Field和Method的使用方法
8、動態代理模式的使用方法
9、Java框架開發原理
第三階段 Android基礎階段大綱
一、UI基礎
1.Android環境搭建及工程目錄介紹:1.1 Android開發(版本:SDK21及以上版本)環境搭建1.2 Android發展史、移動設備操作系統、四層系統架構等理論知識1.3 HelloWorld程序1.4 adb shell簡介(install uninstall)
2.常用UI布局及主要控制項2.1 LinearLayout2.2 RelativeLayout2.3 FrameLayout2.4 GridLayout2.5 TextView基本用法
3.表單UI控制項及相應控制項的事件處理3.1 EditText、Button、ImageView3.2 RadioButton及RadioGroup的用法3.3 CheckBox的多選效果及監聽3.4 Toast的基本用法
4.Spinner、AutoCompleteTextView、ScrollView及適配器、數組資源4.1 Spinner4.2 適配器4.3 數組資源4.4 AutoCompleteTextView4.5 ScrollView4.6 ProgressBar、SeekBar、RatingBar
5.UI美化及Android資源5.1 Style的簡單用法5.2 Android資源匯總
二、應用核心組件初識
1.Activity生命周期及頁面跳轉傳值1.1 Activity的聲明和使用1.2 Activity生命周期1.3 Activity現場保護1.4 Activity基本頁面跳轉及傳值1.5 Activity具有返回值的頁面跳轉
2.Activity啟動模式及Intent七大屬性2.1 Task和Back Stack的基本概念2.2 Activity的啟動模式2.3 Intent屬性的特點及用法
3.AsyncTask非同步任務3.1 使用非同步任務的必要性3.2 非同步任務的用法
4.ListView基本用法及適配器介紹4.1 ListView基本用法4.2 SimpleAdapter4.3 BaseAdapter
5.ListView優化及分頁載入數據、GridView載入網路圖片、ExpandableListView5.1 ListView優化5.2 ListView滾動監聽實現分頁載入數據5.3 GridView載入圖片
三、數據存儲
1.菜單及對話框1.1 OptionsMenu1.2 ContextMenu1.3 PopupMenu1.4 PopupWindow1.5 AlertDialog1.6 ProgressDialog1.7 列表對話框1.8 自定義Dialog
2.數據存儲2.1 SharedPreferences2.2 內部存儲2.3 外部存儲2.4 存儲Bitmap圖片到外部存儲
3.SQLite資料庫與CursorAdapter適配器3.1 回顧SQLite3.2 SQLiteOpenHelper的用法3.3 CursorAdapter
4.ContentProvider4.1 ContentResolver實現系統資料庫的操作4.2 自定義ContentProvider
5.Loader5.1 CursorLoader的用法5.2 AsyncTaskLoader載入本地數據
四、移動開發主流界面實現
1.動畫資源1.1 幀動畫1.2 補間動畫1.3 屬性動畫
2.Fragment2.1 Fragment基本用法2.2 Fragment傳值2.3 Fragment性能優化
3.ViewPager3.1 ViewPager與適配器3.2 ViewPager載入網路圖片3.3 PagerAdapter的優化
4.書簽導航4.1 書簽導航多種實現方式(無需代碼實現)4.2 RadioGroup + ViewPager + Fragment實現導航4.3 HorizontalScrollView + ViewPager + Fragment實現導航
5.Handler、Looper消息傳遞機制5.1 Handler、Looper消息傳遞機制的原理5.2 Handler、Looper源碼
五、應用核心組件進階(Android Studio開發環境教學)
1.ActionBar (Action View、SearchView)+ ToolBar1.1 ActionBar1.2 ToolBar
2.BroadcastReceiver及Notification2.1 Notification (普通通知、大視圖通知、進度條通知、自定義通知)2.2 廣播接收器2.3 自定義發送廣播
3.Service基礎3.1 Service介紹3.2 Start Service3.3 IntentService3.4 Bind Service3.5 兩種服務混合使用實現MediaPlayer音樂播放
4.跨進程的Service4.1 AIDL4.2 Messenger
5.LruCache與Bitmap二次采樣、WebView與HTML5混合開發5.1 LruCache5.2 二次采樣5.3 WebView5.4 HTML5混合開發
六、View深入探究
1.網路地圖1.1 網路地圖基本用法1.2 網路地圖搜索
2. 事件分發消費機制2.1 事件分發消費機制原理2.2 事件分發消費機制的應用場景
3.自定義View(一)3.1 自定義View介紹3.2 自繪制的自定義View
4.自定義View(二)4.1 具有介面回調的自定義View4.2 繼承於ViewGroup的自定義View
5.機型適配及SVN搭建5.1 機型適配介紹5.2 屏幕相關重要概念回顧5.3 機型適配的解決方案5.4 SVN搭建
第四階段 Android項目實戰階段大綱
一、項目實戰第一階段
1.TabLayout及SlidingPaneLayout1.1 TabLayout(5.0Material Design新技術)與ViewPager配合自定義Tab1.2 SlidingPaneLayout左側或右側滑動1.3 NavigationView(5.0Material Design新技術)HeaderLayoutMenu xml配置Navigation監聽事件
2.okHttp網路訪問框架及Picasso2.1 okHttp框架的介紹2.2 okHttp框架的用法Http請求方法:get,post同步請求,非同步請求(回調在非UI線程中)2.3 Picasso載入網路圖片的用法簡單圖片請求Picasso通用配置:內存緩存大小,磁碟緩存大小及位置圖片載入配置:下載尺寸,填充模式,載入中圖片,錯誤圖片2.4 第三方側滑菜單:SlidingMenu菜單設置
3.Fresco(壁畫非同步載入圖片框架)3.1 Fresco框架的介紹3.2 Fresco框架的用法(中文文檔)簡單圖片請求Fresco通用配置:內存緩存大小,磁碟緩存大小及位置圖片載入配置:下載尺寸,填充模式,載入中圖片,錯誤圖片,頂層,底層,圖片變形
4.PullToRefresh、SwipeRefreshLayout及Ultra PullToRefresh4.1 PullToRefresh框架配置事件回調多種控制項PullToRefreshBase重寫4.2 SwipeRefreshLayout配置事件回調4.3 Ultra PullToRefresh(中文文檔)配置事件回調多種下拉效果
5.打包(按渠道打包)、混淆及數字簽名5.1 按渠道打包基本打包多渠道:資源,清單文件,代碼,調試5.2 混淆開啟混淆混淆配置:保留類,保留方法,忽略錯誤5.3 數字簽名生成keystore配置簽名
二、項目實戰第二階段——Android新技術
1.RecyclerView1.1 5.0新技術介紹(Material Design)設計理念、新增控制項1.2 RecyclerView的用法、CardView的用法1.3 RecyclerView與ListView比較
2.5.0Material Design新技術2.1 CoordinatorLayoutToolbar與Layout2.2 TextInputLayout錯誤監聽2.3 Snackbar監聽Action2.4 FloatingActionButton屬性介紹onClick
3.媒體播放器3.1 視頻播放器VideoView3.2 SurfaceView及MediaPlayerSurfaceView介紹與View區別SurfaceHolder與CallBackMediaPlayer.setDisplayMediaPlayer載入網路視頻3.3 獲取視頻縮略圖使用Fresco3.4 ListView的item實現視頻播放Item顯示視頻單Item播放Item滾出時停止播放3.5 播放器全屏顯示與恢復3.6 Vitamio(維他密播放器)
4.攝像頭、感測器、ZXing二維碼4.1 利用Intent實現攝像頭兩種模式,存文件和縮略圖4.2 加速度感測器實現《搖一搖》感測器獲取感測器監聽注冊加速度感測 搖一搖4.3 ZXing實現生成二維碼(容錯等級、二維碼正中心Logo)生成BitMatrix轉Bitmap容錯等級中心Logo4.4 ZXing實現二維碼掃描導包
5.JPush推送、ShareSDK一鍵分享及第三方登錄5.1 JPush極光推送的原理及用法通知推送消息推送推送原理5.2 ShareSDK一鍵分享及第三方登錄注冊集成分享第三方登錄APIOAuth介紹
三、項目實戰第三階段
1.加密解密1.1 對稱加密(AES 、DES、3DES)1.2 非對稱加密(RSA)1.3 消息摘要(MD5、 SHA-1 )1.4 編碼解碼(Base64、URLEncode、URLDecode)
2.網路支付2.1 Alipay支付2.2 微信支付
3.ButterKnife(反轉注入框架)、EventBus、ActiveAndroid(資料庫ORM框架)及Retrofit(網路訪問框架)3.1 ButterKnife(反轉注入框架)3.2 EventBus的用法3.3 ActiveAndroid(資料庫ORM框架)3.4 Retrofit(網路訪問框架)
4.項目實戰需知4.1Git、UML4.2XMPP4.3常見面試題4.4移動端與伺服器端的交互流程4.5移動開發工程師與web工程師工作配合的流程4.6面試常用技巧(面試禁忌)4.7開發規范(代碼規范)
第五階段 就業指導及職業規劃
⑺ 求比較好的android培訓的課程
可以看看android培訓學習課程大綱了解下,課程分階段進行,不同階段學習的詳細內容可以看下。
第一階段:Android編程基礎--JavaSE階段()
Java語言入門
1、介紹計算機的基本使用和DOS常用命令 2、Java概述和開發環境 3、關鍵字、標識符、常量與變數 4、數據類型和運算符
5、流程式控制制與數組 6、方法的定義及格式、正確的調用方法
OOP編程
1、面向對象編程(OOP)、類和對象 2、成員變數和局部變數、方法(方法重載)、匿名對象 3、構造方法、封裝、this關鍵字
4、方法參數的傳遞(傳值、傳址)、static關鍵字 5、繼承、super關鍵字、方法的重寫、訪問修飾符許可權 6、抽象類與抽象方法、介面
7、多態(對象的多態,對象的轉型) 內部類和常用的設計模式
Java核心API
1、異常、異常處理,自定義異常
2、java基礎類庫:Object類、Scanner類、String類、StringBuffer類、
StringBuilder類、Arrays類、基本包裝類(拆箱、裝箱)、正則表達式、Math類、Random類、System類、Date類、DateFormate類、Calendar類,及其常用方法
3、 *** 框架:Collcetion介面、List介面、Set介面、Iterator介面、Map介面
4、List介面:ArrayList類、LinkedList類、Vector類、Stack類 Set介面:HashSet類、TreeSet類、Map介面: HashMap類、HashTable類、LinkedHashMap類、TreeMap類
5、泛型的使用
6、File類、File類的常用方法
7、I/O操作:IO流的種類,IO流的使用(位元組輸入/輸出流、字元輸入/輸出流、 位元組(字元)緩存流、轉換流、列印流、內存流、對象流、隨機讀取流) 多線程的使用(Thread類的常用方法、線程的生命周期,線程的實現、線程的安全問題)
網路與Web應用
1、Socket編程
2、HTML(結構,form表單)、Servlet簡介
3、SQLite資料庫的使用
4、HTTP網路訪問(URL類、HttpURLConnection類、HttpClient類)
5、JSON解析(JSON的格式、JSON的常用解析:JSON、Gson、fastJson)
6、XML解析(XML簡介、兩種常用的解析方式: PULL解析、SAX解析) 反射機制
第二階段:Android開發初級階段
UI基礎
1、Android發展史及四層系統架構
2、Android環境搭建及SDK介紹
3、創建第一個Android程序
4、Eclipse開發APP的目錄結構
5、Android Studio開發APP的目錄結構
6、adb shell簡介
7、View常用屬性
8、Android長度相關單位的概念、區別及轉換運算(sp、dp、dip、px、dpi)
9、LinearLayout及RelativeLayout特有屬性
10、FrameLayout及GridLayout特有屬性
11、TextView、EditText、Button、ImageView基本用法
12、RadioButton及RadioGroup的用法
13、CheckBox的多選效果及監聽
14、Spinner常用屬性及適配器
15、AutoCompleteTextView、ScrollView、ProgressBar、SeekBar、RatingBar的基本用法
16、Style的作用及基本用法
17、Android常用資源(id、字元串資源、顏色資源、尺寸資源、布局資源、數組資源、樣式和主題資源 、菜單資源、圖像資源、動畫資源、原生xml資源、raw資源、特殊Drawable資源、自定義屬性資源)
應用核心組件初識
1、Activity生命周期及頁面跳轉傳值
2、ctivity啟動模式及Intent七大屬性
3、AsyncTask非同步任務 ListView常用屬性、方法及監聽器ListView與ArrayAdapter的使用
4、ListView與SimpleAdapter的使用
5、SimpleAdapter與ViewBinder結合使用
6、ListView與BaseAdapter
7、ListView優化(內存空間優化、運行時間優化、ListView中item多布局的復用)
8、ListView滾動監聽實現分頁載入數據
9、GridView載入圖片
10、ExpandableListView的用法
數據存儲及相關組件
1、菜單及對話框 (OptionsMenu、ContextMenu、PopupMenu、PopupWindow、AlertDialog、ProgressDialog、列表對話框、自定義Dialog)
2、SharedPreferences
3、內部存儲的概念及用法
4、外部存儲的概念、存儲目錄及用法
5、存儲Bitmap圖片到外部存儲
6、SQLite資料庫與CursorAdapter適配器
7、ContentProvider與ContentResolver的概念及關系
8、ContentResolver實現系統數據的操作(聯系人、媒體庫文件、通話記錄、簡訊記錄)
9、自定義ContentProvider
10、CursorLoader的使用場景及用法
11、AsyncTaskLoader的用法以及與CursorLoader的對比
移動開發主流界面實現
1、動畫資源(幀動畫、補間動畫、屬性動畫)
2、Fragment基本用法
3、Fragment傳值
4、Fragment性能優化
5、EventBus的作用以及在Fragment中的應用
6、ViewPager基本使用(ViewPager實現歡迎引導頁)
7、ViewPager的適配器PagerAdapter、FragmentPagerAdapter、FragmentStatePagerAdapter
8、ViewPager載入網路圖片
9、PagerAdapter優化
10、TAB書簽導航的多種實現方式
11、RadioGroup + ViewPager + Fragment實現TAB導航HorizontalScrollView + ViewPager + Fragment實現TAB導航
應用核心組件進階
1、ActionBar基本用法(ActionBar顯示和隱藏、ActionBar添加動作項、ActionBar啟動圖標導航、分離式ActionBar、
ActionBar導航模式、ActionBar現場保護 Action View的介紹、ActionProvider)
2、ActionBar上SearchView的用法
3、ToolBar的基本用法
4、ToolBar的Standalone用法
5、Notification (普通通知、大視圖通知、進度條通知、自定義通知)
6、廣播接收器的概念、作用、分類及注冊
7、廣播接收器實現系統監聽(開機監聽、簡訊監聽、電話監聽、耳機插拔監聽、網路狀態改變監聽、電量改變監聽)
8、自定義發送廣播(發送無序廣播、有序廣播、發送本地廣播、注冊本地廣播接收器 )
9、Service的概念、分類、生命周期、注冊及使用場景
10、Start Service實現音樂播放器
11、IntentService實現網路視頻文件下載
12、DownloadManager實現網路視頻文件下載
13、Bind Service實現音樂播放器
14、兩種服務混合使用實現MediaPlayer音樂播放
15、AIDL跨進程Service的概念及用法
16、Messenger的概念及用法
17、Handler、Looper消息傳遞機制的原理
18、Handler、Looper源碼分析
19、LruCache與Bitmap二次采樣
20、WebView基本用法以及與5交互
View深入探究
1、事件分發消費機制的原理分析及應用場景
2、自定義View的常規做法
3、自繪制的自定義View(畫布Canvas、畫筆Paint、重寫onDraw()方法、重寫onMeasure()方法、自定義屬性)
4、組合式自定義View
5、具有手勢監聽的自定義View
6、繼承於ViewGroup的自定義布局
7、Android中機型適配出現的原因(系統碎片和屏幕碎片)
8、機型適配的解決方案(屏幕適配:相對布局、尺寸限定符、最小寬度限定符、屏幕方向限定符、自動拉伸點陣圖,版本適配,語言自適應)
第三階段:Android開發高級階段
常用第三方框架
1、網路地圖(網路地圖API及配置、網路地圖定位及覆蓋物、網路POI檢索、出行線路規劃、公交路線查詢)
2、第三方側滑菜單SlidingMenu及與原生DrawerLayout、SlidingPaneLayout的對比
3、UIL(universal-image-loader)圖片載入框架
4、okHttp網路訪問框架
5、Picasso載入網路圖片框架
6、Fresco載入圖片框架
7、xUtils3、0框架
8、PullToRefresh下拉刷新框架
9、Ultra PullToRefresh下拉刷新框架
10、ButterKnife(反轉注入框架)
11、ActiveAndroid(資料庫ORM框架)
12、Retrofit(網路訪問框架)
Android5.0新技術
1、RecyclerView及CardView
2、ExpandableRecyclerView CoordinatorLayout協調AppBarLayout、CollapsingToolbarLayout、NestedScrollView、 Toolbar、RecyclerView等控制項實現特殊滾動效果
3、TextInputLayout與TextWatcher
4、FloatingActionButton
5、Snackbar
6、TabLayout介紹以及與ViewPager、Fragment配合實現TAB導航效果
7、NavigationView介紹以及結合DrawerLayout使用SwipeRefreshLayout下拉刷新控制項
其他高級技術
1、媒體播放器(MediaPlayer、VideoView、SurfaceView及MediaPlayer)
2、Vitamio第三方播放器
3、攝像頭
4、感測器
5、ZXing二維碼
6、JPush極光推送
7、ShareSDK一鍵分享及
8、第三方登錄
9、Alipay支付及微信支付
10、加密解密(編碼解碼、對稱加密、非對稱加密、消息摘要)/p>
第四階段:Android項目實戰階段
APP開發
1、商業應用項目模擬(項目結構分析及設計、UML、Git、SVN、打包混淆及數字簽名)
2、移動開發工程師與web工程師工作配合的流程
3、常見面試題
4、面試常用技巧(面試禁忌)
5、開發規范(代碼規范)
⑻ google android官方培訓課程中文版這個學完夠嗎
不夠啊,你在多拿幾個項目練練手
⑤ 安卓手機的系統文件哪些可以刪除
安卓手機可以刪除的系統文件:
Browser.apk 系統自帶瀏覽器(可用其他手機瀏覽器替代)
Calculator.apk 計算器(可刪,可用其他替代)
Calendar.apk 日歷(可刪)
CalendarProvider.apk 日歷程序支持服務(可刪)
DSPManager.apk DSP音頻管理(可刪)
FileManager.apk 簡易文件管理器(可刪,可用ES文件管理器替代)
Gallery3D.apk 3D圖片瀏覽器 (可刪)
GenieWidget.apk 天氣與新聞(可刪)
Gmail.apk Gmail(可刪)
GoogleBackupTransport.apk ***(未知程序,可刪)
GoogleCalendarSyncAdapter.apk 存儲日歷信息(可刪)
GoogleContactsSyncAdapter.apk 存儲聯系人信息(可刪)
GooglePartnerSetup.apk Google助手(可刪)
GoogleQuickSearchBox.apk 谷歌搜索(可刪)
HTMLViewer.apk HTML瀏覽器(可刪)
kickback.apk 輔助功能!
LauncherPro.apk 原生桌面(可刪)
LiveWall**sPicker.apk 動態壁紙(可刪)
Maps.apk Google地圖(可刪)
Market*r.apk 市場升級(不確定)
MediaUploader.apk 媒體升級(可刪)
Mms.apk 自帶信息(可刪) `
Music.apk 自帶音樂(可刪,用自己喜歡的播放器吧)
NetworkLocation.apk 網路位置(可刪)
OneTimeInitializer.apk ***(未知,可刪)
PhoneGuard.apk 撥號衛士(可刪)
PicoTts.apk 可刪(文字語言轉換的語音合成引擎,設置-語音輸入與輸出中)
Protips.apk 桌面小綠人插件(可刪)
導(在定製Rom時不可刪,刷好機可用Root Explorer刪掉)
soundback.apk 輔助功能(可刪)
Street.apk 街道(可刪)
Talk.apk 系統服務項(可刪)
talkback.apk 輔助功能(可刪)
TtsService.apk Text-to-speech服務(可刪)
*r.apk 在線升級(可刪)
UserDictionaryProvider.apk 用戶數據字典服務(可刪)
Vending.apk 電子市場(可刪)
VoiceSearch.apk 語音搜索(可刪)
精簡常見問題解答:
部分程序精簡卸載了之後對在線升級有影響,比如:Updater.apk 等。可以通過下載版本對應的OTA升級包,放入SD卡,進行手動升級,完全是沒有問題的。
具體方法:下載對應的升級包(.zip),放入SD卡根目錄,手機端打開「系統升級」;按「菜單鍵」選擇「選擇安裝包」,找到升級包,確認重啟升級。
如果此方法升級失敗可手動進入Recovery,依次選擇:install zip from sdcard;choose zip from sdcard;找到OTA升級包,確認選擇Yes即可更新升級;
⑥ 關於Android 平台開發相關的有哪些推薦書籍
推薦十本Android開發暢銷書籍:
1. 《Android基礎教程》本書是一部關於 android開發的基礎教程,採用由淺入深、循序漸進的方式討論android。書中還結合數獨游戲等實例更加形象生動地講解了 android開發的基本流程,且每章最後都有一個 「快速閱讀指南 」,更加方便了讀者的閱讀。. 本書內容完整豐富,具有較強的通用性,讀者都能通過本書快速學習 android開發,提高相關技能。
2. 《Android應用開發揭秘》(累計印刷6次,內容已更新至Android 2.2,版權輸出至台灣)這是一本參考手冊,內容的完整性和系統性幾乎無可挑剔,可作為廣大Android開發者的案頭必備書;這是一部權威指南,基礎知識部分翔實而豐富,高級知識部分深入且飽含最佳實踐,能從本質上提升開發者對Android的理解和開發水平。尤為值得一提的是,Android 2.0中新增了大量激動人心的新特性,不僅支持多點觸摸設備、軟鍵盤,而且還支持多賬戶在線管理、藍牙……作為國內第一本基於Android 2.0的著作,本書可謂極具前瞻性,第一時間將這些新特性完美地呈現給了廣大讀者。
3. 《Google Android SDK開發範例大全》(09年度暢銷榜NO.10)(台灣天瓏書局09年超級暢銷書)本書以android手機應用程序開發為主題,通過130多個範例全面且深度地整合了手機、網路及服務等多個開發領域,為讀者提高程序設計功力提供了很大的幫助。. 全書共分10章,主要以範例集的方式來講述android的知識點,詳細介紹了開發android的人機交互界面、android常用的開發控制項、使用android手機收發簡訊等通信服務、開發android手機的自動服務功能和娛樂多媒體功能以及整合android與aoogle強大的網路服務等內容,隨書光碟中包括了所有範例的程序代碼。
4. 《Google Android SDK開發範例大全(第2版)》 本書在上一版的基礎上,以android手機應用程序開發(採用android sdk 2.1)為主題,通過160多個範例全面且深度地整合了手機、網路及服務等多個開發領域,為讀者提高程序設計功力提供了很大的幫助。全書共分10章,主要以範例集的方式來講述android的知識點,詳細介紹了開發android的人機交互界面、android常用的開發控制項、使用android手機收發簡訊等通信服務、開發android手機的自動服務功能和娛樂多媒體功能以及整合android與aoogle強大的網路服務等內容。隨書光碟中包括了所有範例的程序代碼。本書講述由淺入深,由android的基礎知識到實際開發應用,結構清晰、語言簡潔,非常適合android的初學者和android的進階程序開發者閱讀參考。
5. 《Android/OPhone開發完全講義》(此書版權已經輸出到台灣)推薦這本書有兩個原因:一是移動開發的廣闊前景,使得越來越多的企業、開發者投入其中。相比iPhone而言,Android平台的開放性以及國內市場的廣闊性,使得它更有代表性;二是作者李寧,他寫作的理論性和實踐性兼備,以及對技術的孜孜追求,使得這本書在Android開發的實戰方面很具代表性。也希望讀者朋友和我一樣能從這本書中獲益。
6. 《Android系統原理及開發要點詳解》 本書全面介紹開放的行動電話平台android系統,包括android系統中的linux驅動、本地框架、java框架和java應用4個層次。本書內容以知識性內容為綱,重點關注開發要點,各個部分內容注重相互照應,按照清晰的思路向讀者介紹整個android系統的原理和開發方法。本書按照android系統的框架和各個子系統的主線,重點介紹開發android應用程序和構建硬體抽象層。其內容涵蓋了android應用程序開發和android系統移植構建手機系統兩大方面。本書既適合從事android各個層次開發的工程師閱讀,也適合通用嵌入式linux系統的學習者使用。
7. 《深入淺出Google Android》(示例生動豐富,理論和實踐完美結合)本書是國內最早的android開發團隊的集體智慧結晶,真正完全基於android最新的sdk 1.5,內容詳實,示例生動豐富,包含大量示例代碼,可操作性強。它不僅涵蓋了android平台從基礎概念到高級應用的所有主題,而且深入淺出地介紹了幾種常見的android項目,具有很強的參考價值。特別是在本書的第10、11章重點介紹了android sdk 1.5引入的最為重要的三個特性,即桌面部件、實時文件夾、虛擬鍵盤與輸入法應用的開發方法。.. 通過本書,讀者可以迅速掌握android平台來構建應用程序,成為android開發高手,躋身新技術的弄潮兒。
8. 《Google Android開發入門與實戰》(09年度暢銷榜TOP50)(附贈400分鍾高清教學視頻,涵蓋5大商業案例完整源代碼)本書內容上涵蓋了用android開發的大部分場景,從android基礎介紹、環境搭建、sdk介紹、market使用,到應用剖析、組件介紹、實例演示等方面。從技術實現上,講解了5個android平台下的完整綜合實例及源代碼分析,分別是rss閱讀器、基於google map的個人gps、豆瓣網(web 2.0)客戶端、在線音樂播放器、手機信息查看助手。本書注重對實際動手能力的指導,在遵循技術研發知識體系的嚴密性同時,在容易產生錯誤、不易理解的環節配以了翔實的開發情景截圖,並將重要的知識點和開發技巧以「小實驗」、「小提醒」、「小知識」、「注意」等的活潑形式呈現給讀者。在程序實例的講解方面,主要將實例安插在android開發的精髓知識章節,這為初學者學習與實踐結合提供了很好的指導。. 本書配套有400多分鍾的全程開發視頻光碟,指導讀者快速、無障礙地學通android實戰開發技術。
9. 《精通Android游戲開發》(將本地PC游戲輕松移植到Android的秘技) 本書討論如何將pc 上的3d 游戲移植到android 平台。作者從必備的技能和軟體工具入手,逐步介紹如何從頭構建純java 游戲,如何混合使用opengl 3d 圖形和jni,並以真實的pc游戲wolfenstein 3d和doom為例,介紹如何融合java 的優雅設計和c 的強大功能,使混合游戲達到最佳性能。本書適合熟悉android 平台的開發人員閱讀。
10. 《人人都玩開心網:Ext JS+Android+SSH整合開發Web與移動SNS》 本書的主旨為,以開心網為例實現web版和android版的sns應用。本書分為四篇,前三篇主要實現了web版的開心網系統。其中重點介紹了ext js技術,包括ext js的核心組件、對話框、表單組件、布局、數據校驗、表格、菜單、樹組件等技術。本書的最後一篇實現了android版的開心網,並介紹了與android版開心網相關的技術,包括button、textview、edittext、imageview、gridview等android組件。本書適於以下幾類人群:了解傳統的web應用程序的開發,希望使用ext js開發web程序的開發人員;了解基本的ext js程序的開發方法,想增加實踐經驗的開發人員;對ext js感興趣,想進一步提高ext js開發技能的讀者;對android感興趣,想從事android開發的讀者;想開發基於android客戶端的c/s程序,但對開發流程不了解的讀者。
⑦ android 代碼中設置控制項的垂直居中和兩個控制項之間的距離。
首先是垂直居中,下面有朋友已經回答了,而控制項和控制項之間的距離設置是設置margin