方法重载与覆盖的区别

方法的重载属于编译时多态,方法名相同参数列表不同,返回值必须相同或都没有返回值类型。方法的覆盖属于运行时多态,子类覆盖父类的方法,子类指向父类引用,在调用方法的时候用父类的引用调用。

String 和StringBuffer的区别

String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符串倒序,比如字符串“abcde” 变成“edcba”
String src = "ABCDEF ";
String dst = new StringBuffer(src).reverse().toString();

抽象类与接口的区别

abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用abstract定义该类,即抽象类。
用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即public static final修饰的字段。

线程有几种状态,分别是哪些

1)、新建状态(New):新创建了一个线程对象。
2)、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3)、运行状态(Running):就绪状态的线程获取了CPU,执行run()方法。
4)、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5)、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
当调用start方法的时候,该线程就进入就绪状态。等待CPU进行调度执行,此时还没有真正执行线程。
当调用run方法的时候,是已经被CPU进行调度,执行线程的主要任务。

线程的实现方式

线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口

final、finally、finanlize()的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

常用设计模式及应用场景

单例模式: Calendar实例的获取
适配器模式: Adapter为ListView GridView等添加数据
工厂模式: Spring IOC 反转控制
代理模式: Spring AOP 面向切面编程
观察者模式: ContentObserver监听内容改变

用两种方式实现单例模式,要求线程安全

(懒汉式)程序执行过程中需要这个类的对象时再实例化该类的对象
步骤1.定义静态私有对象
2. 构造方法私有化保证在类的外部无法实例化该类的对象
3. 定义对外开放的静态方法在调用方法是判断对象是否为空,为空再创建对象返回
public class Singleton {
private static Singleton singleton;
// 构造方法私有化,保证在类的外部无法实例化该类的对象
private Singleton() {
}
public static synchronized Singleton getSingletonInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
(饿汉式)类加载的时候就实例化该类的对象
public class Singleton {
private static Singleton singleton = new Singleton();
// 构造方法私有化,保证在类的外部无法实例化该类的对象
private Singleton() {
}
public static Singleton getSingletonInstance() {
return singleton;
}
}

Android系统架构

1)应用程序层 java语言 应用程序开发
2)应用程序框架层 java语言 OS定制 framework层开发
3)系统运行库层 C C++ 实现 so库
4)Linux内核层

Activity生命周期

void onCreate(Bundle savedInstanceState) 第一次创建时调用
void onStart() 被用户可见时调用
void onRestart() 当Activity处于stop状态又被重新启动时调用
void onResume() 当获得焦点即可与用户交互时调用
void onPause() 当失去焦点时调用
void onStop() 当不可见时调用
void onDestroy() 当销毁时调用

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

Android四大组件

Activity :应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Service 服务:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。
BroadcastReceive广播接收器:你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息。
Content Provider内容提供者 :主要用于多个应用间数据共享。这些数据可以存储在文件系统中或SQLite数据库。

广播如何调用,有什么方式,各自的区别

程序中发送广播通过sendBroadcastReceiver()实现
接收广播通过定义一个类继承BroadcastReceiver并重写onReceive()方法实现
注册广播有两种方式:
第一种静态方式:在清单文件中通过标签声明
第二种代码动态方式:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

Android中asset文件夹和raw文件夹区别

res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1)res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2)res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
3)读取文件资源举例:
读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is = getResources().openRawResource(R.raw.filename);
读取assets下的文件资源,通过以下方式获取输入流来进行写操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");

Android中的五种存储方式及其应用场景

1)SharedPreferences
存储路径:(data/data/packagename/shares_prefs), 轻量级存储,以键值对的形式存储在xml中,一般用来保存应用中的设置属性
2)文件存储;opSD卡存储多媒体文件, 文件缓存
3) Sqlite数据库 存储路径:(data/data/packagename/databases), 一种嵌入式数据库,支持sql语言,存储大量结构性数据
4)ContentProvider 进程(应用程序)间数据共享,数据源可以是sqlite,也可以是xml,相关类: ContentResolver(内容解析器), ContentObserver(数据 观察者)
5) 网络存储 天气数据的xml,json格式等等,通过HttpUrlConnection,HttpClient,或者SOAP协议获取数据

什么是ANR 如何避免它

ANR:Application Not Responding(应用程序无响应).当出现下列情况时,Android就会显示ANR对话框了: 对输入事件(如按键、触摸屏事件)的响应超过5秒 意向接受器(intentReceiver)超过10秒钟仍未执行完毕Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。
解决方案有两种:
1. AsyncTask异步任务中,doInBackground()和onPostExecute(Result)两个方法非常重要
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如移动护理系统中的网络连接、解析XML等操作。该方法必须重载。
onPostExecute(Result) 这个方法也运行于UI线程,在doInBackground(Params…)方法执行后调用,该方法用于处理后台任务执行后返回的结果。
2. 子thread + handler

Handler的运行机制

一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。
其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。

Listview优化策略

1)对convetView进行判空,是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建
2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
3)当ListView加载数据量较大时可以采用分页加载和图片异步加载

ListView分页加载实现思路

实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载

ListView图片异步加载实现思路

1.先从内存缓存中获取图片显示(内存缓冲)
2.获取不到的话从SD卡里获取(SD卡缓冲,,从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅)
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

Intent的原理,作用,可以传递哪些类型的参数

Intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable或者Parcelable的类型。
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

如何实现屏幕分辨率的自适应

最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小。
尽量使用Relativelayout 。
已知应用支持平台设备的分辨率,可以提供多个layout_320*480 ...
drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360, 放置图片大小相差1.5倍
最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity = "true"/>
在标签和 标签之间添加上面那段代码。即可。
备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小
还可以通过.9.png实现图片的自适应

Android程序入口如何判断

action节点中的android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点

Android哪几种方式访问网络

HttpURLConnection
HttpClient方式(HttpGet和HttpPost类)
Volley

移动互联数据交互格式有哪些及其区别

移动互联数据交互格式有XML和JSON
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML

XML解析有哪几种

基本的解析方式有三种: DOM,SAX,Pull
1.dom解析解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构的优点是对文档增删改查比较方便,缺点占用内存比较大。
2.sax解析基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改查。
3.pull解析同样基于事件驱动型,android 官方API提供,可随时终止

GC内存泄露在什么情况下回出现?怎么解决?

(一) 查询数据库没有关闭游标
(二) 构造Adapter时,没有使用缓存的 convertView
(三) Bitmap对象不在使用时调用recycle()释放内存
(四) 不用的对象没有及时释放对象的引用

Android内存的优化

Android内存泄露容易导致内存溢出,又称为OOM。
Android内存优化策略:
1)在循环内尽量不要使用局部变量
2)不用的对象即时释放,即指向NULL
3)数据库的cursor即时关闭。
4)构造adapter时使用缓存contentview
5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()
6)即时关闭InputStream/OutputStream。
7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle
8)尽量避免static成员变量引用资源耗费过多的实例。

加载大图片的时候如何防止内存溢出

Android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。
Android加载大量图片内存溢出解决方案:
1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source
2)使用BitmapFactory.Options对图片进行压缩
InputStream is = this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; //width,hight设为原来的十分一
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载
及时销毁不再使用的Bitmap对象
if(!bmp.isRecycle() ){
bmp.recycle() //回收图片所占的内存
system.gc() //提醒系统及时回收
}

Android缓存机制

客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择,比如有些新闻客户端支持离线模式,也是通过缓存机制实现的.缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存.
文字缓存有两种实现:
1)可以将与服务器交互得到的json数据或者xml数据存入sd卡中,并在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是请求的URL,另一个则是本地保存后的文件地址,每次加载数据之前都会根据URL在数据库中检索
2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回.
多媒体文件缓存:主要指图片缓存
图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录
缓存文件删除策略:
1. 每一个模块在每次客户端自动或者用户手动更新的时候删除相应模块的缓存文件,并重新下载新的缓存文件.
2. 在设置界面中提供删除缓存的功能,点击后删除本机所有缓存.

如何实现消息推送,有哪些方式,各自优缺点,最常使用哪种?

实现消息推送的方式有五种,分别是轮询,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 我们做项目时采用的是XMPP协议
1.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。GTalk、QQ、IM等都用这个协议。
2.轮询:客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送, 而是去服务端拽数据。但是实现简单,主要缺点:耗电,浪费用户流量等
3.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。
4.通过短信方式, 但是很难找到免费短信平台
5. MQTT协议, IBM提供的一种推送服务,不太灵活

MVC在Android中的应用

Android中界面部分也采用了当前比较流行的MVC框架,在Android中:
1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。也可以使用JavaScript+HTML等的方式作为View层,通过WebView组件加载,同时可以实现Java和JavaScript之间的通信。
2) 控制层(Controller):这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,Android的控制层的重任通常落在了众多的Acitvity的肩上,程序就很容易被回收掉。
3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。
在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。

Android自定义组件实现思路

Android自定义组件有三种实现思路:
1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
2) 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
3) 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件

版本更新的实现思路

在服务器相应URL上有版本文件, 客户端同时存储该应用当前版本号 (SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一 致,则自定义对话框提示是否下载更新

播放视频有哪些实现方式

1.使用系统自带的播放器来播放,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
2. 使用VideoView组件来播放, 可以结合MediaController来实现播控, 只是不能随意更改视频的大小及位置。
3. 使用MediaPlayer和SurfaceView来实现,这种方式很灵活,可以自定义视频播放的大小和位置。

NDK开发流程

NDK应用的开发流程(在应用中定义本地接口(native), 编译成.h头文件,交由C程序员实现,将.c实现通过NDK编译成.so动态链接库,导入项目中libs/armeabi,代码中调用该本地接口)
应用场景: 音频,视频解码,拍摄车牌号,识别车牌号

如何实现一键退出

定义一个类继承Application,定义一个集合存放所有的activity,
定义一个添加的方法,再写一个退出的方法,使用for循环全部调用finish方法,然
后在每个Activity的onCreate方法中调用自定义类里的添加方法,然后在需要使用一键退出的地方调用类中的退出方法即可。

Android客户端如何实现自动登录

通过SharedPreferences存储用户名,密码,当存储不为空时实现自动登录功能

本文介绍了本人接触过的、试用过的、使用过的一些针对Android平台的第三方服务平台,涵盖了从开发、测试、发布、运营的整个流程,了解了这些平台,肯定会对你的APP开发起到很大的简化作用,可以大大提高开发效率。

推送

极光推送

极光推送是我接触的最早的推送平台,那还是2011年,当时国内基本上就这么一家提供推送服务,并且这家公司也从最开始的小团队逐渐成长为了大公司。
该平台支持针对Android、iOS、WinPhone的消息推送,服务端支持多种语言,后台控制台界面也相对比较友好。
极光推送的特色在于可以支持多种推送方式,可以把用户按照标签分类,并且针对标签推送。
不足之处在于复杂网络情况下,推送有时候不及时。

网址:https://www.jpush.cn/

个推

在使用了极光推送一段时间后,2013年开始,大量的推送平台开始出现了,其中个推是我个人认为很不错的一个选择。
该平台只支持Android、iOS的推送,但是相比较激光推送,其稳定性较好。

网址:http://www.getui.com/

友盟

友盟最开始是做数据统计分析的,好像是从2013年开始提供了推送服务。

网址:http://www.umeng.com/

百度云

相比较于极光、个推等中小型公司,百度的服务我个人认为是最可靠的,但是其垃圾的后台界面让我不能忍受。

网址:http://developer.baidu.com/cloud/push

云巴

云巴是从极光推送分裂出来的,个人没有试用过,不过基于极光的技术,应该是有保障的。

网址:http://yunba.io/

华为推送

号称是电信级别的推送能力,但是本人一向对华为的服务不感冒。

网址:http://developer.huawei.com/push

小米推送

如果你的应用小米用户居多,那么必然要使用小米推送,系统级别的推送可以给用户更好的体验。

网址:http://dev.xiaomi.com/doc/?page_id=1670

 

以上是我接触过的推送平台,基本上针对开发者都是免费服务,并且使用方法也是大同小异,具体选择什么平台,需要针对各自的实际情况进行测试之后再做选择。

 

测试

Android版本多,机型多,所以兼容性测试显得尤其重要。国内也有几家公司提供了云测试服务,主要集中于针对APP的功能测试、性能测试和兼容性测试。

Testin云测

Testin云测试平台是一个基于真实终端设备环境,基于自动化测试技术的7x24云端服务。Testin在云端部署了300多款1000多部测试终端,并开放这些智能终端给全球移动开发者进行测试,开发者只需在Testin平台提交自己的App应用,选择需要测试的网络、机型,便可进行在线的自动化测试,无须人工干预,自动输出含错误、报警等测试日志、UI截图、内存/CPU/启动时间等在内的标准测试报告。支持Android与iOS,它的业务也较为全面。

网址:http://www.testin.cn/

百度云测试MTC

MTC是百度云面向移动和web开发者提供的服务,能够满足一般的测试需求,包括当前的热门机型,还支持云端客户端回放。它还提供一个云众测服务,就是开放者上传App,百度提供给用户下载测试,然后将反馈收集返回给开发者,这在国外是一种比较火的方式,不过目前貌似没有做起来。

网址:http://mtc.baidu.com/

易测云

易测云由我的老东家东软集团出品,是一个专业为移动APP产品提供适配测试、性能测试、遍历测试、功能测试等多种服务的真机自动化云测试平台,主要为所有移动APP产品的开发者和测试者、以及需要定制化服务的企业级用户,提供安全、专业、高效、易用的自动化云测试服务;强大的录制脚本插件;详细实用的测试报告;以及简单人性化的操作体验。

网址:http://www.yiceyun.com/

 

本人在实际的项目中用的是Testin,它的报表功能确实不错,值得推荐。

统计

APP发布之后,需要对用户数、使用时长、启动次数等做统计,相信这也是不少产品经理的主要KPI了,我这里介绍两个提供统计服务的平台。

友盟

友盟是老牌的提供应用统计分析的平台了,本人一直在用,数据及时并且各种报表比较完备,强烈推荐。

网址:http://www.umeng.com/

魔方

基本上提供了友盟一样的功能,不过先入为主,二者只能选择一个,我肯定选择友盟。

网址:http://www.imofan.com/

 

应用数据统计,使用友盟是第一选择。

即时通讯

随着微信的火爆,以及各种APP都要加入社交功能,2014年开始,提供即时通讯服务的平台一下子就涌现出了好多家。

环信

环信是其中最热门的一家公司了,融资、免费,在百度投放了大量广告。
其实现了类似微信的单聊,群聊,发语音,发图片,发位置等功能,并且300万以下注册用户完全免费,这个意思就是针对大多数APP是完全免费的。
他们提供的Demo程序本人试用过,效果确实不错,值得推荐。

网址:http://www.easemob.com/

融云

“多年专注于移动互联网即时通讯,提供稳定可靠的 App 沟通能力”,这是他们的口号。
但是移动互联网才几年,微信才几年,一家口号就明显夸大其词的公司,个人不信赖。

网址:http://www.rongcloud.cn/

 

社交分享

社交分享其中最重要的是两个功能:第三方登陆和一键分享。

友盟

友盟号称提供"APP开发及运营一站式解决方案",这其中肯定会包含社交分享的功能。

网址:http://www.umeng.com/

sharesdk

这个应该算是国内最出名的移动端社交分享SDK了,很可靠,一直在用。

网址:http://mob.com/

短信云

短信云主要提供发短信的功能,尤其是APP用户注册需要验证手机号码的时候,必用。

sharesdk

现在大优惠,基本上不用付费哦,而且经过博主实测,很及时,很好用。sharesdk的服务果然值得信赖。

网址:http://mob.com/

邮差云

这家是传统的短信提供商转型的产品,没使用过,明显的缺乏互联网(免费)思维,不推荐。

网址:http://www.smslinkapi.com/

后台baas

Baas,后端即服务。如果你对服务端编程没什么经验的话,Baas可以提供基础的服务端功能。

bmob

很奇怪的一家公司,国内算是起步很早的,但是一直发展缓慢,从去年开始又有比较大的动作了,而且官网提供了Demo,很不错。

网址:http://bmob.cn/

LeanCloud

这家公司更奇怪,以前叫做AVosCloud,不过因为域名带了AV两个字母,经常被屏蔽,就改为现在的域名了。这家我现在在使用中,推荐。

网址:https://leancloud.cn/

云存储

云存储提供文件存储服务,尤其是在前两年瀑布流盛行的时候,提供图片存储服务。

七牛

由技术大牛创业的一家公司,商务营销做得也不错,而且经常有优惠,推荐。博主也在使用。

网址:http://www.qiniu.com/

通过 https://portal.qiniu.com/signup?code=3lfl9s1wivioe 这个链接注册可以给我增加流量哦。

又拍

比较早的图片存储服务商,对图片的存储/处理都有很好的支持,博主一直在用。

网址:https://www.upyun.com/index.html

广告

admob

Google的服务,点击率还不错,不像国内很多厂商会有扣量,第一选择。

有米

国内做的比较好的了,不过我是不待见国内这些做移动广告的。

等等..

应用平台

由于国内上不了Google Play,滋生了很多应用分发市场,最盛的时候估计有上千家,不过随着时间的推移,慢慢就只剩下巨头们了。

360

360凭借流氓手段在电脑上占领了很大市场,所以对于手机端也很有优势。下载量大,审核快,推荐。

http://dev.360.cn/

应用宝

腾讯的应用宝很奇怪,感觉应该是量很大,但是博主的应用在应用宝的下载量明显不如360。

http://open.qq.com/

百度

百度可谓是一个巨头,旗下百度手机助手、91、安智,都是量很大的市场,而且只要提交百度,会自动同步到安智、91,值得推荐。

http://developer.baidu.com/mobile

豌豆荚

豌豆荚是独立于巨头的一家平台,最近一直要转型,而且频频传出一些不好的消息,个人不看好。

http://open.wandoujia.com

小米

小米应用市场凭借小米手机的火爆,也算是一家巨头了。

http://dev.mi.com/

其他

其他想木蚂蚁、安卓、EOE、机锋等等,基本上不做考虑了。

一键提交多平台

有了那么多应用市场,如果要一个一个去提交审核的话,也是需要花费不少时间的。一键提交平台就是只要在这个平台提交了,会推送到其他各个平台。

zhuamob

目前博主只知道这一家,仅仅是试用过,如果你有这方面的需求的话,不妨试试。

快速开发

快速开发指的是利用一些现有的工具、框架等,可以快速搭建、开发APP。

apicloud

号称“积木拼装”式的开发跨平台App"。貌似是提供了一个基于Eclipse的IDE环境,而且有配套的云端服务,还有模块化的可复用的模板,一切看起来都很美好。有兴趣的可以尝试。

juhe.cn

聚合数据,提供了很多API,包括天气、身份证、菜谱等等,很全的数据。强烈推荐。

 

以上这些是我试用过的或者接触过的服务平台,其实每个平台也都提供了多种服务,大家如果能活用这些服务的话,相信会对APP开发带来很大便利。

本文章系本人原创,如需转载,请注明出处 www.liuzhibang.cn

大道三千,何以证道?

最近有私信、邮件给我咨询一些职业生涯规划的同学,我在这里以过来人的身份给大家一些建议。

任何行业,任何职位,无论高低,无论大小,都可以分为广博、精深两个方向。

精深自然指的是在某一领域造诣深厚,当然也不会是对别的技术一无所知,否则就成了独腿人,岂能走得远?
广博自然指的是涉及面广,知识丰富,对各种技术都有所涉猎,当然不会是浅尝辄止的接触,所谓的全栈程序员自然属于这一类型,我本身也是这一类型的。

精深

首先说一下精深,作为Android程序员,所必需掌握的基础知识:

0. Java核心编程

Android的开发语言是Java,所以Java是作为一名Android程序员所必须掌握的。
我这里推荐几本书,Think in Java(Java编程思想)、Core Java(Java核心技术)、Effective Java,看过这三本书,你的Java技术就相当有保障了。

1. Android基础知识

Android四大组件及生命周期
Layout布局方式
各种控件的使用方式
Activity间传值、Activity与Fragment间传值
不同分辨率的界面适配
事件及回调机制
本地数据存储
HTTP访问网络
Widget的使用
针对各个Android版本的适配

2. 进阶

adb命令的使用
Activity、Service、Broadcaster互相调用
通知栏Notification的使用
Alarm的使用
SMS的使用
线程的使用
Handler消息机制
AsyncTask异步调用机制
Intent、Intent-filter的使用
使用自定义style、theme、drawable等方式美化界面
动画效果的使用
硬件调用,摄像头、录音、录像、地理位置
APP版本升级、本地数据库版本升级
音频、视频处理
自定义布局、界面
WebView的使用以及WebView和本地代码间通讯
各种第三方类库的使用
各种第三方平台的使用

3. 高阶

2D/3D图形应用
传感器的使用
蓝牙、NFC等的使用
性能优化
NDK的使用
Framework层修改
自定义ROM
适配Android系统到不同的硬件设备

我个人认为,
基础阶段可以制作出能用的功能简单的APP、这是一个普通开发人员所必须掌握的;
进阶阶段可以制作出好用的能吸引人的APP、这是一个技术负责人所必须掌握的;
高阶阶段则可以制作出MIUI这样的系统级别的框架了;更可以进军眼下火热的智能家居、智能眼镜行业了。这是一个技术总监所应具有的素质。

 

广博

如果你要是想走广博这条路,那么会有很多新奇的、好玩的技术等着你。

但是首先,你要达到Android进阶水准,否则就不要自称是Android程序员了。
当你达到了进阶水准后,你的兴趣可能就不仅仅止于Android,可能你对iOS有兴趣,对服务端开发有兴趣,对Web开发有兴趣,对HTML5开发有兴趣,对设计有兴趣,对游戏开发有兴趣,等等等等,我这里对每一个方面都做一些简单介绍吧。

iOS

iOS和Android就是一对儿双胞胎,很多人在做了一段时间的Android开发后,或者做了一段时间的iOS开发后,都想学学对方的技术。
个人认为iOS的学习曲线较Android要高,学习成本也较大,苹果三件套是必备的,不过iOS开发真的很火呀,而且开发出来的APP美观度比Android不知道高到哪里去了。

服务端

Android APP是客户端,那么对于大多数的APP来说,是需要服务端提供服务、数据之类的,那么现今流行的服务端有哪些语言呢?
首推Java,Java的框架多呀,开发快呀,资料多呀,像SSH、Spring MVC、Jfinal、ofBiz呀,这些都是很流行的框架,我这里推荐Jfinal,典型的快速开发框架。
其他像Python的Django、Ruby on Rails、ThinkPhp等都是动态语言Web框架的经典,可以根据各自兴趣着重学习一种。
最不推荐的就是.Net,虽然VS很强大,WebService也很不错,但是个人认为不像Java那么规范,也不像动态语言那么快速,最不喜欢.Net框架,个人偏好而已。

前端

我把前端技术定义为HTML(5)、CSS(3)、JS等这些技术的合并体,网页所最终呈现出来的效果都是由我们的前端工程师完成的。
而且现在有非常多的前端框架,像Bootstrap、JQuery UI、Semantic UI、NEJ、Pure UI、Amaze UI等等,都是现在很流行的框架,大家可以学习学习。

设计

我认为的设计分为交互设计、视觉设计,
视觉设计肯定要掌握Photoshop之类的设计工具,并且有一定的美感(这个就仁者见仁了),
交互设计是现在设计中很需要强调的一部分,很多网站、APP外观看起来也不错,但是实际使用就感觉有些别扭,不尽如人意,那就是交互设计有缺陷。
一个经典问题:弹出框的[确定][取消]按钮,iOS默认确定在右,Android默认确定在左,那么如果你是一个交互设计师,你的APP需要同时在两个平台发布,这个按钮你应该如何设计呢?

游戏

现在游戏也是多种多样,页游、端游、手游一波一波的,我这里只对手游有过了解,所以只说说这一部分。
手游现在国内最火的框架就是cocos2d了,支持多种平台,而且有很多的资源可以参考;
另外像Unity、OGEngine、AndEngine、LGame、也都是不错框架。

等你掌握了以上这些技术之后,你就是一个典型的全栈工程师了,从设计到开发到运营你都可以胜任,这个时候,你就可以跟老板说:我可以干五个人的活,只要三个人的工资了。
更可以在家Soho了,作为自由职业者,或者创业也都是不错的选择的。

看到这里,你肯定已经有了自己的选择了。

我个人的看法是,走自己的路,让别人说去吧。

本文章系本人原创,如需转载,请注明出处 www.liuzhibang.cn

相信已经有一些同学已经对怎么开发Android应用有了一些感觉了,在一些网友发给我的工程中有很多也都加入了自己个性化的东西,这样很好。

现在我们回过头来看看我们都学到了哪些知识。

 

第一天

万事开头难,我们在这一天里搭建了基础的开发环境,并且做出了第一个页面,俗称“Hello,world”。

 

第二天

我们初步了解了布局文件,并且使用了第三方库-xUtils进行了http访问,调用了百度天气API并且把天气信息以文本的形式展现出来了。

 

第三天

我们较为深入的学习了常见的各种布局,并且重点学习了ListView 的使用。

 

第四天

天气信息终于能够以列表的形式展示了,并且还有天气小图标哦。这里有一个重要的类:BaseAdapter,一定要熟练掌握这个类,会经常用到。

 

第五天

进行了理论知识的补充,对Android的体系架构、项目结构有了初步认识。

 

第六天

有突破的一天,我们学习了百度定位的使用,并且学习了Preference这一经常会用到的本地数据存储方式。

 

第七天

理论知识进一步深入,对于Activity的生命周期有了更加深刻的理解。

 

第八天

这一天的内容很多很多,并且都很重要。主要是Activity间传值、Application的使用、本地数据库的使用、文本框事件监听,并根据我们对Activity生命周期的理解重构了代码。

 

第九天

主要学习了Fragment的使用,以及Fragment和ViewPager的搭配使用,可以做出左右滑动的界面哦。

 

第十天

这一天的主要工作就是打包、发布我们的天气预报APP了。

 

经过这十天的学习,相信很多同学都可以初步开发出一些简单的APP了,如果大家还有什么疑问、建议,都可以加入我们的Android学习群:44133900,我们一起来交流。

此系列文章系本人原创,如需转载,请注明出处 www.liuzhibang.cn

本次是这个教程的最后一篇了,我们的APP开发基本上已经可以宣告完成了,接下来的工作就是如何发布推广运营了。

 

广告平台

古人云:兵马未动,粮草先行。我们身为APP开发者就需要考虑如何从APP盈利,目前通常的做法主要有APP收费、APP免费+内购及嵌入广告三种方式,我们这个简单的APP想让用户付费是比较有难度的,那么就只能通过嵌入广告的方式来赚取一点广告费了。

我经常使用的广告平台就是Admob了,不过Admob国内被屏蔽,但是广告依然可以展示,各位程序员一定要学习科学上网,否则。。。

话说回来,国内的广告平台也有很多,像百度、腾讯、360、有米、万普等等,都提供了很简单方便易用的服务,我们只需要按照官方文档一步步就可以加入广告了,这里我就不写这些内容了。例程里面也不会有含有广告的。

我这里简单列一下:

百度联盟:http://union.baidu.com/

腾讯广点通:http://e.qq.com/

360:http://dev.360.cn/mod/mediaV/intro

有米:http://www.youmi.net/

万普:http://www.waps.cn/

 

 

APK打包

下面,我们来看一下怎么发布APP。

总共分三步,打包、签名、上传,呵呵,简单吧,如果使用工具就会更加简单。

在Eclipse中右键点击项目,选择[Android Tools]->[Export Signed Application Package...],

QQ截图20150117142704

点击[Next],会出现选项,[Use existing keystore]和[Create new keystore],如果您以前有发布过Android APP经验话的,肯定有这个keystore文件。不过鉴于我们是第一次开发APP,这里我们就老老实实选择[Create new keystore]就可以了。

QQ截图20150128194315

输入密码之后,点击[Next],这个界面要填的内容非常多,其中有一项很重要:

Validity (years),这个代表了这个keystore的有效期,我们就填1000年就好了,也不要太多 :)。

其他项目均可以随便填写。

QQ截图20150117144511

然后继续[Next],这里就是我们的打包文件的路径了,

QQ截图20150128194438

点击[Finish],稍等几秒钟,我们第一个APP就开发完成了。

最后,我们把生成的apk文件安装到手机上试试看,是不是很有成就感!!!!!

 

就这样,我们的APP就开发完成了,赶快让它进入市场,接受大家伙的批评吧。

发布到应用市场

Android应用市场国内那是相当乱了,我们需要抓大放小,把我们的APP上传到几个大市场就可以了。

我通常的选择是百度、腾讯应用宝、360、豌豆荚、安智、木蚂蚁、应用汇,关于如何发布,请参考各大网站的介绍。

我这里简单列一下:

百度:http://developer.baidu.com/

应用宝:http://open.qq.com/

360:http://dev.360.cn/

豌豆荚:http://open.wandoujia.com/home

安智:http://dev.anzhi.com/

木蚂蚁:http://dev.mumayi.com/

应用汇:http://dev.appchina.com/

 

 

本系列教程到此就算是结束了,大家一步步从零开始,做出了一个虽然简单但是完整的天气预报APP,也用到了Android里面最核心、也是开发项目过程中必须用到的Activity、数据库、HTTP、图片展示、数据转换等知识,这些知识还需要大家在实际的工作中慢慢加深理解才能熟练应用,才能开发出更好用的APP。

 

最后祝大家工作愉快,生活顺心。

 

写到这里,感觉我们的APP还是有很多缺陷,比如:

1. 界面真的很糟糕,有很大的美化余地

2. 第一次启动的时候,感觉比较慢

3. 选择城市的页面,肯定有更好的处理方法

4. 只显示天气是否太简单了?可以加入类似墨迹天气一样的穿衣指南、PM25等等

5. 能否每天早上7点钟自动播报天气?

等等等等

这些您可以作为之后的版本升级内容逐渐加进去哦。

如果您的天气预报APP真的上线了,请一定让我知道,我去给你点赞。等着大家的好消息!!!

 

此系列文章系本人原创,如需转载,请注明出处 www.liuzhibang.cn