当前位置:首页 » 安卓系统 » android动态表单

android动态表单

发布时间: 2023-02-27 05:38:32

① 如何构建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

热点内容
韩服lol挂机脚本 发布:2025-05-15 12:42:56 浏览:460
监控存储服务器如何调试 发布:2025-05-15 12:36:30 浏览:217
一万级净化车间有哪些配置 发布:2025-05-15 12:16:41 浏览:97
javazip解压加密 发布:2025-05-15 12:15:02 浏览:941
dnf服务器存放什么信息 发布:2025-05-15 12:11:07 浏览:216
办公室视频剧本脚本 发布:2025-05-15 12:03:51 浏览:491
编译失败什么意思 发布:2025-05-15 11:58:18 浏览:87
lcs脚本官网 发布:2025-05-15 11:56:15 浏览:88
三国志战略版打9级矿什么配置 发布:2025-05-15 11:41:29 浏览:953
安卓加速器怎么关 发布:2025-05-15 11:38:16 浏览:466