一.关于项目结构。
- MVC架构: 模型(model)--控制器(control)--视图(布局view)
Model:在项目结构里体现为包model,封装一些数据并且大都含有数据对应的getter和setter的方法。 model类可有着如下特殊使用:GreenDao的实体类、 Gson注解@SerializedName属性对json数据字段重命名、实现接口Serializable、static内部类。
View:由布局,还有自定义的view组成。自定义的view常常包含在widget中。
Control:除以上之外的activity,adapter,net,receiver,stroge,utils等。
- application:MyApplication+notifier
MyApplication持有:单例模式、 全局context、监听所有Activity的生命周期变化(需要注册)(接口Application.ActivityLifecycleCallBacks)、Activity管理(List<Activity>)。
- BaseFragment:onActivityCreated 、onStart、onRequestPermissionsResult,onDestroy、以及setListener。
- BaseActivity :集合子Acitivity的共性,以及强制子Activity的行为。1.初始化视图,数据:setContentView----initView--ToolBar 的 支 持。 2.服务的绑定。
- enums:使用枚举常量(无类型的标识常量)类来管存常量。
二.Adapter
- FragmentPagerAdapter:
- PagerAdapter:使用List<View>操作。
- BaseAdapter:---getView--使用static内部类ViewHolder避免每次调用都实例find...-----通过tag进行绑定和获取当前应该的 view。
三.Service
- 音频焦点:
* AudioManager :AudioManager provides access to volume and ringer mode control. * 提供对音量和振铃模式控制的访问。 * AudioFocus :音频焦点,,用来处理多个应用占用音频资源的问题 * 当获取到音频焦点,就可以播放, 当丢失了音频焦点,播放器停止或者暂停播放 //音频焦点变化时 调用 @Override public void onAudioFocusChange(int focusChange) { switch (focusChange){ case AudioManager.AUDIOFOCUS_GAIN:{ if (isPausedByFocusLossTransient){ AudioPlayer.get().startPlayer(); // 重新获得焦点 ,回复播放 } AudioPlayer.get().getMediaPlayer().setVolume(1f,1f); //设置音量 isPausedByFocusLossTransient=false; break; } //永久丢失焦点,,被其他播放器所占 case AudioManager.AUDIOFOCUS_LOSS: { AudioPlayer.get().pausePlayer(); break; } //短暂丢失焦点,如来电 case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:{ AudioPlayer.get().pausePlayer(false); isPausedByFocusLossTransient=true; break; } //瞬间丢失焦点,如通知 ,,,duck: 回避,鸭子 ,低下头 case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:{ //音量减小一半 AudioPlayer.get().getMediaPlayer().setVolume(0.5f,0.5f); } }
- 服务详解初步:https://blog.csdn.net/javazejian/article/details/52709857
三.Stroge---SharedPreferences。
四.自定义绑定@Bind注解---(view、holder)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bind {
int value();
}
public class ViewBinder {
public static void bind(Activity activity){
bind(activity,activity.getWindow().getDecorView());
}
public static void bind(Object target, View source) {
Field[] fields = target.getClass().getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
try {
field.setAccessible(true);
if (field.get(target) != null) {
continue;
}
Bind bind = field.getAnnotation(Bind.class);
if (bind != null) {
int viewId = bind.value();
field.set(target, source.findViewById(viewId));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
五.ScreenUtils 尺寸工具
- 获得屏幕高度
public static int getScreenWidth(){
WindowManager wm=(WindowManager)sContext.getSystemService(Context.WINDOW_SERVICE);
return wm.getDefaultDisplay().getWidth();
}
-
获取状态栏高度
int resourceId=sContext.getResources().
getIdentifier("status_bar_height","dimen","android"); //获得资源id
if(resourceId>0){
result=sContext.getResources().getDimensionPixelSize(resourceId);
}
-
dp,px,sp 转化
final float scale = sContext.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); ..............
六.View
- AblistView:
- LinearLayout:addView()。
- SearchView:
七.自定义Drawable:
- ValueAnimator:
- 基本标签:set、level-list、gradient、animation-list、corners