SkillAgentSearch skills...

ZCommon

An android library for application's fast developing.

Install / Use

/learn @yuyuyu123/ZCommon
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

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

View on GitHub
GitHub Stars35
CategoryDevelopment
Updated2y ago
Forks2

Languages

Java

Security Score

65/100

Audited on Dec 6, 2023

No findings