ZCommon
An android library for application's fast developing.
Install / Use
/learn @yuyuyu123/ZCommonREADME
ZCommon
Dependency
Step1:在根目录.build文件下添加
repositories {
maven { url "https://jitpack.io" }
}
Step2:在具体项目.build目录下添加
implemention 'com.github.yuyuyu123:ZCommon:1.3.3'
AOP Supports
ZCommon中添加了对Aspectj的依赖,支持AOP编程。
1.添加依赖
首先需要在根目录的build文件下添加依赖:
repositories {
google()
}
dependencies {
classpath 'org.aspectj:aspectjtools:1.9.1'
classpath 'org.aspectj:aspectjweaver:1.9.1'
}
然后在app目录的build文件下添加如下代码:
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
final def log = project.logger
final def variants = project.android.applicationVariants
variants.all { variant ->
//打Release包的时候,整个if判断注释掉,否则AOP会不起作用。
if (!variant.buildType.isDebuggable()) {
log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
return;
}
JavaCompile javaCompile = variant.javaCompile
javaCompile.doLast {
String[] args = ["-showWeaveInfo",
"-1.8",
"-inpath", javaCompile.destinationDir.toString(),
"-aspectpath", javaCompile.classpath.asPath,
"-d", javaCompile.destinationDir.toString(),
"-classpath", javaCompile.classpath.asPath,
"-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)
]
log.debug "ajc args: " + Arrays.toString(args)
MessageHandler handler = new MessageHandler(true);
new Main().run(args, handler);
for (IMessage message : handler.getMessages(null, true)) {
switch (message.getKind()) {
case IMessage.ABORT:
case IMessage.ERROR:
case IMessage.FAIL:
log.error message.message, message.thrown
break;
case IMessage.WARNING:
log.warn message.message, message.thrown
break;
case IMessage.INFO:
log.info message.message, message.thrown
break;
case IMessage.DEBUG:
log.debug message.message, message.thrown
break;
}
}
}
}
注:若网络比较慢,建议Fan Qiang(你懂得)依赖,否则可能会失败。
2.使用
关于aspectj的具体使用方法请自行查找教程并学习
3.ZCommon中提供的aspect功能
3.1 处理快速点击
若需要处理快速点击,只需要在对应的方法中添加@FastClick注解接口,例:
@FastClick
public void fastClick(View view) {
Log.e(TAG, "fastClick-----------");
}
3.2 权限申请
ZCommon中针对Android M提供了动态权限申请服务,包含Java代码的方式(见下文)和注解的方式,注解包含三个部分:
1.GPermission(Get Permission),申请权限;
2.CPermission(Permission Canceled),权限被用户拒绝,但允许再次提示;
3.DPermission(Permission Denied),权限被用户拒绝,且不允许再次提示。
下面分别对这三个注解进行讲解:
3.2.1 申请单个权限
@GPermission(value = {Manifest.permission.ACCESS_FINE_LOCATION},requestCode = 1)
private void location() {
T.showShort(this, "定位权限通过");
}
3.2.2 申请多个权限
@GPermission(value = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 10)
private void takePhoto() {
T.showShort(this, "拍照和文件读写权限通过");
}
3.2.3 权限被拒绝,但允许再次提示
@CPermission(requestCode = 10)
public void dealCancelPermission(PermissionCanceled bean) {
Toast.makeText(this, "requestCode:" + bean.getRequestCode(), Toast.LENGTH_SHORT).show();
}
3.2.4 权限被拒绝,且不允许再次提示
@DPermission
public void dealPermission(PermissionDenied bean) {
if (bean == null) return;
Toast.makeText(this, "requestCode:" + bean.getRequestCode()
+ ",Permissions: " + Arrays.toString(bean.getDenyList().toArray()), Toast.LENGTH_SHORT).show();
switch (bean.getRequestCode()) {
//权限被拒绝后,一般提示用户到设置界面手动打开权限
case 1:
//多单个权限申请返回结果
break;
case 10:
//多个权限申请返回结果
break;
default:
break;
}
}
3.3 登录验证
我们在开发过程中有许多地方需要验证用户是否已经登录,对此,ZCommon对其作了统一处理:
首先需要在Application类中对LoginManager类进行初始化:
@Override
public void onCreate() {
super.onCreate();
LoginManager.get().init(this, new OnLoginListener() {
@Override
public void login(Context context, int val) {
Log.e(TAG, "login-------->" + val);
//这里写登录逻辑,比如跳转到登录界面
if(val == 5) {//根据变量的值可以作不同的操作
}
}
@Override
public boolean isLogin(Context context) {
Log.e(TAG, "isLogin-------->");
//这里判断是否已经登录
return false;
}
});
}
然后在需要验证登录的地方添加Login注解:
@Login(val = 100)
public void login(View view) {
T.showShort(this, "登录了哦");
}
Data Requests
1.约定:数据请求一律采用RxJava+Retrofit
2.配置
1.请求单个base url
ConfigurationHelper.setBaseUrl(URLHelper.BASE_URL);
ConfigurationHelper.setOkhttpClient(okHttpClient);
2.请求多个base url
Map<String , String> baseUrlMap = new HashMap<>();
String url1 = "";
String url2 = "";
baseUrlMap.put(key1, url1);
baseUrlMap.put(key2, url2);
ConfigurationHelper.setBaseUrlMap(baseUrlMap);
Map<String,OkHttpClient> clientMap = new HashMap<>();
clientMap.put(key1, okHttpClient1);
clientMap.put(key2, okHttpClient2);
ConfigurationHelper.setOkhttpClientMap(clientMap);
说明:
1.虽然多个base url可以共用一个OkHttpClient对象,但是为了适应不同的配置,即使是相同的OkHttpClient也要放进Map中;
2.设置base url的map和设置client的key必须一一对应
3.使用
1.请求单个base url
BaiduService service = ManagerFactory.getFactory().getManager(BaiduService.class);
2.请求多个base url
OneService service1 = ManagerFactory.getFactory().getManager(OneService.class, key1);
TwoService service2 = ManagerFactory.getFactory().getManager(TwoService.class, key2);
说明:
1.单个base url的使用可以不传key,对应只设置base url;
2.多个base url的使用必须传key区分,对应设置base url map;
3.上面只是罗列了要点,具体使用可以参考内部app。
Request Logging
如果需要打印网络请求,建议用OkHttp3提供的拦截器HttpLoggingInterceptor,只需要在请求前配置即可,例:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.d("okhttp", message);
}
});
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
new OkHttpClient
.Builder()
.addInterceptor(logging);
Https
OkHttp支持Http和Https两种协议的请求,只需要在请求前用ZCommon内的HttpsUtils配置一下即可,例:
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
new OkHttpClient
.Builder()
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager);
Crash Handler
为了防止NullPointerException等Bug导致程序崩溃,可以在自定义Application中使用CrashHandler类,例:
public class App extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
initCrashHandler();
}
private void initCrashHandler() {
CrashHandler.init((thread, throwable) -> {
new Handler(Looper.getMainLooper()).post(() -> {
try {
//处理错误,可以上报,也可以不处理
} catch (Throwable e) {
}
});
});
}
}
Status Bar
ZCommon中提供了状态栏适配的Util叫StatusBarUtil,建议在基类里面作统一适配,例:
public abstract class DkBaseActivity<V extends RxBaseView, P extends RxBasePresenter<V>>
extends RxBasePermissionActivity<V, P> {
@Override
protected void init(Bundle savedInstanceState) {
super.init(savedInstanceState);
StatusBarUtil.showStatusBarWithLightMode(this, com.ccclubs.common.R.color.material_light_white);
}
}
Activity
建议在业务baseLib中可以根据自己的需求写一到多个基类Activity,继承RxBaseActivity或者RxBasePermissionActivity(封装了权限请求),例新建一个处理Umeng统计的基类:
public abstract class DkBaseActivity<V extends RxBaseView, P extends RxBasePresenter<V>>
extends RxBaseActivity<V, P> {
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onPageStart(TAG);
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPageEnd(TAG);
MobclickAgent.onPause(this);
}
}
例写一个处理滑动返回的基类:
public abstract class DkBaseSwipeBackActivity<V extends RxBaseView, P extends RxBasePresenter<V>> extends DkBaseActivity<V,P> {
@Override
protected void init(Bundle savedInstanceState) {
super.init(savedInstanceState);
if(isSwipeBackEnabled()) {
SwipeBackManager.onCreate(this);
SwipeBackManager.getCurrentPage(this)//get current instance
.setSwipeBackEnable(true)//on-off
.setSwipeEdge(mScreenWidth / 5)
.setSwipeEdgePercent(0.2f)
.setSwipeSensitivity(0.6f)
.setClosePercent(0.5f)
.setSwipeRelateEnable(false)
.setSwipeRelateOffset(500);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if(isSwipeBackEnabled()) {
SwipeBackManager.onPostCreate(this);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(isSwipeBackEnabled()) {
SwipeBackManager.onDestroy(this);
}
}
}
1.setContentView 当Activity需要setContentView时,可以复写下面两个方法:
@Override
protected abstract int getLayoutId() {
return R.layout.activity_home_layout;
};
@Override
protected View getLayoutView() {
return new FrameLayout(this);
}
如果复写了getLayoutView方法,getLayoutId方法将失效。
2.初始化数据
@Override
protected void init(Bundle savedInstanceState) {
super.init(savedInstanceState);
//初始化,包括findViewById
}
3.Activity内创建Presenter
Activity或Fragment内需要创建Presenter需要复写createPresenter方法
@Override
protected SplashPresenter createPresenter() {
return new Spl
Related Skills
node-connect
339.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.9kCommit, push, and open a PR
