简书地址:http://www.jianshu.com/p/ef486092c750
AndroidBasicProject是一个简易的Android基础项目,方便您快速进行开发。包含以下内容: 基础的Activity、Fragment;下载管理;异常信息收集;日志打印;通用适配器;常用工具类。
Demo下载
第一步:
dependencies { compile 'com.classic.core:classic:1.5' }
第二步:
public class YourApplication extends Application {
public static final String LOG_TAG = "classic";
private static final String ROOT_DIR_NAME = "classic";
@Override public void onCreate() {
super.onCreate();
//可选配置,默认目录名称:download
SDcardUtil.setRootDirName(ROOT_DIR_NAME);
SDcardUtil.initDir();
//配置异常信息收集
CrashHandler.getInstance(this);
//日志打印配置
Logger
.init(LOG_TAG) // default PRETTYLOGGER
.hideThreadInfo() // default show
//.logLevel(LogLevel.NONE) // default LogLevel.FULL
//.methodOffset(2) // default 0
//.logTool(new AndroidLogTool()) // custom log tool, optional
;
}
}
CommonAdapter - tianzhijiexian
logger - Orhan Obut
LogUtils - pengwei1024
v1.5
BaseActivity、BaseFragment添加initInstanceState方法,方便做一些状态的恢复操作。
BaseFragment添加onHidden方法,当前fragment被切换到后台时会执行此方法。
修复一些工具类的bug。
Activity示例
public class TestActivity extends BaseActivity {
@Bind(R.id.main_rv) RecyclerView recyclerView;
private List<Demo> demos;
private DoubleClickExitHelper doubleClickExitHelper;
@Override public int getLayoutResId() {
return R.layout.activity_test;
}
@Override public void onFirst() {
super.onFirst();
Logger.d("onFirst只有第一次才会执行");
//这里可以做一些界面功能引导
}
/** * 方法执行顺序: * initPre() --> initInstanceState(Bundle savedInstanceState) --> * initData() --> initView() --> register() */
@Override public void initPre() {
super.initPre();
//这个方法会在setContentView(...)方法之前执行
}
@Override public void initInstanceState(Bundle savedInstanceState) {
super.initInstanceState(savedInstanceState);
//这里可以做一些状态的恢复操作
}
@Override public void initData() {
super.initData();
demos = Demo.getDemos();
Logger.object(demos);
//双击退出应用工具类使用方法,别忘了重写onKeyDown方法(见底部)
doubleClickExitHelper = new DoubleClickExitHelper(this);
//.setTimeInterval(3000)
//.setToastContent("再按一次退出demo");
}
@Override public void initView() {
super.initView();
ButterKnife.bind(this);
recyclerView.setOnClickListener(this);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(new CommonRcvAdapter<Demo>(demos) {
@NonNull @Override public AdapterItem<Demo> getItemView(Object o) {
return new TextItem();
}
});
}
@Override public void register() {
super.register();
EventUtil.registerEventBus(this);
//这里可以注册一些广播、服务
}
@Override public void unRegister() {
super.unRegister();
ButterKnife.unbind(this);
EventUtil.unRegisterEventBus(this);
//注销广播、服务
}
@Override public void viewClick(View v) {
switch (v.getId()){
case R.id.main_rv:
//点击事件处理
break;
}
}
@Override public void showProgress() {
//需要显示进度条,可以重写此方法
}
@Override public void hideProgress() {
//关闭进度条
}
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
return doubleClickExitHelper.onKeyDown(keyCode, event);
}
}
Fragment示例
public class TestFragment extends BaseFragment {
@Override public int getLayoutResId() {
return R.layout.fragment_test;
}
@Override public void onChange() {
//当前fragment从后台被切换到前台时会执行此方法
}
@Override public void onHidden() {
super.onHidden();
//当前fragment从前台被切换到后台时会执行此方法
}
@Override public void onFirst() {
super.onFirst();
Logger.d("onFirst只有第一次才会执行");
//这里可以做一些界面功能引导
}
/** * 方法执行顺序: * initInstanceState(Bundle savedInstanceState) --> * initData() --> initView(View parentView) --> register() */
@Override public void initInstanceState(Bundle savedInstanceState) {
super.initInstanceState(savedInstanceState);
//这里可以做一些状态的恢复操作
}
@Override public void initData() {
super.initData();
}
@Override public void initView(View parentView) {
super.initView(parentView);
ButterKnife.bind(this, parentView);
}
@Override public void register() {
super.register();
//这里可以注册一些广播、服务
}
@Override public void unRegister() {
super.unRegister();
ButterKnife.unbind(this);
//注销广播、服务
}
@Override public void viewClick(View v) {
//处理一些点击事件
switch (v.getId()){
case R.id.button:
//...
break;
case R.id.text:
//...
break;
}
}
@Override public void showProgress() {
//需要显示进度条,可以重写此方法
}
@Override public void hideProgress() {
//关闭进度条
}
}
启动页示例
public class SplashActivity extends BaseSplashActivity {
@Override protected void setSplashResources(List<SplashImgResource> resources) {
/** * SplashImgResource参数: * mResId - 图片资源的ID。 * playerTime - 图片资源的播放时间,单位为毫秒。。 * startAlpha - 图片资源开始时的透明程度。0-255之间。 * isExpand - 如果为true,则图片会被拉伸至全屏幕大小进行展示,否则按原大小展示。 */
resources.add(new SplashImgResource(R.mipmap.splash,1500,100f,true));
resources.add(new SplashImgResource(R.mipmap.splash1,1500,100f,true));
resources.add(new SplashImgResource(R.mipmap.splash2,1500,100f,true));
}
@Override protected boolean isAutoStartNextActivity() {
return false;
}
@Override protected Class<?> nextActivity() {
return null;
//如果isAutoStartNextActivity设置为true,这里需要指定跳转的activity
//return MainActivity.class;
}
@Override protected void runOnBackground() {
//这里可以执行耗时操作、初始化工作
//请注意:如果执行了耗时操作,那么启动页会等到耗时操作执行完才会进行跳转
//try {
// Thread.sleep(15 * 1000);
//} catch (InterruptedException e) {
// e.printStackTrace();
//}
}
}
通用适配器示例 点击查看更多介绍
@Override public void initView() {
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(new CommonRcvAdapter<Demo>(demos) {
@NonNull @Override public AdapterItem<Demo> getItemView(Object o) {
return new TextItem();
}
});
}
private class TextItem implements AdapterItem<Demo> {
@Override public int getLayoutResId() {
return R.layout.activity_main_item;
}
private ViewHolder holder;
private View view;
@Override public void onBindViews(View view) {
this.view = view;
//在这里做findviewById的工作吧
holder = new ViewHolder(view);
}
@Override public void onSetViews() {
//这个方法仅仅在item构建时才会触发,所以在这里也仅仅建立一次监听器,不会重复建立
holder.mainItemCardview.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
final int position = recyclerView.getChildAdapterPosition(v);
itemClick(demos.get(position));
}
});
}
@Override public void onUpdateViews(Demo demo, int i) {
// 在每次适配器getView的时候就会触发,这里避免做耗时的操作
holder.mainItemCardview.setCardBackgroundColor(demo.bgColor);
holder.mainItemTv.setText(demo.title);
}
}
class ViewHolder {
@Bind(R.id.main_item_tv) TextView mainItemTv;
@Bind(R.id.main_item_cardview) CardView mainItemCardview;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
打印日志 点击查看更多介绍
Logger.d("hello");
Logger.e("hello");
Logger.w("hello");
Logger.v("hello");
Logger.wtf("hello");
//打印json数据
Logger.json(JSON_CONTENT);
//打印xml数据
Logger.xml(XML_CONTENT);
//打印对象(Bean,Array,Collection,Map...)
Logger.object(object);