前言
写任何代码,当你想简化代码的时候,封装之后自己方便用的时候 便是你最有心得时候,用的时候更是愉悦,久而久之都有自己的一套快速开发,常见的有会封装 application,activity 亦或是万能的adapter 。泛型,不定长数组,接口,等等都是很好的方法,注解,现在便以activity 总结一些个人的base系列,或者大家可以留言 想封装任何自己觉得很重复的代码。
为什么想出这个呢,只鉴于我的同事,宁愿复制几十遍相同代码 说这样快,也不愿意封装一下下。现在提供自己封装的一些很基础常用的小玩意儿
所以以下代码都是封装在BaseActivity中,使用场景都是extends BaseActivity
封装内容
1. startActivityForResult +onActivityResult
2. 精准位置 log and toast
3. Build.VERSION_CODES.M 动态权限申请
4. 更新中
* 略简化findViewById (Butterknife使用者可以无视此行 哈哈~~~~)
1.startActivityForResult +onActivityResult
一般开启一个activity呢,回来想来传值或者即时回调呢 需要实现这个两个方法 甚至还有一个定义final的int,作为接头暗号,十分麻烦,尤其是这两个方法使用的地方距离较远 onActivityResult 一般在偏底部的位置。而startActivityForResult 可能哪里都会在,代码多的时候查看很跳跃,不方便,但两者的逻辑确实的关联在一起写的。
假设我们不需要传什么code。能够写出类似Onclick回调多好
使用效果,(虽然本身是不需要传code的)
startActivityWithCallback(new Intent(MainActivity.this, Activity2.class), new ResultActivityAdaptor.ResultActivityListener() {
@Override
public void onResult(int requestCode, int resultCode, Intent intent) {
}
});
实现代码
1.public abstract class BaseActivity extends Activity
public void startActivityWithCallback(Intent intent, ResultActivityAdaptor.ResultActivityListener listener) {
mResultActivityAdaptor.startActivityForResult(intent, listener);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mResultActivityAdaptor.onResult(requestCode, resultCode, data);
}
2.ResultActivityAdaptor
package baseframe.rex.com.utils.base;
import android.app.Activity;
import android.content.Intent;
import android.util.SparseArray;
/**
* Created by Rex on 2017/4/10.
*/
public class ResultActivityAdaptor {
private static final int REQUEST_CODE_START = 20000;
private SparseArray requests = new SparseArray();
private Activity mActivity;
private int currentReqCode = 20000;
public ResultActivityAdaptor(Activity activity) {
this.mActivity = activity;
}
public void startActivityForResult(Intent i, ResultActivityListener listener) {
++this.currentReqCode;
this.requests.put(this.currentReqCode, listener);
this.mActivity.startActivityForResult(i, this.currentReqCode);
}
public boolean onResult(int requestCode, int resultCode, Intent data) {
ResultActivityListener listener = (ResultActivityListener)this.requests.get(requestCode);
if(listener != null) {
listener.onResult(requestCode, resultCode, data);
this.requests.remove(requestCode);
return true;
} else {
return false;
}
}
public interface ResultActivityListener {
void onResult(int requestCode, int resultCode, Intent intent);
}
}
log and toast
public abstract class BaseActivity extends Activity
public static final String LOG_TAG = "rex";
//输出的简化
//精准到 类 方法名 行 log输出
public static String buildHeader() {
StackTraceElement stack = Thread.currentThread().getStackTrace()[4];
return String.format("%s->%s->%d", new Object[]{stack.getClassName(), stack.getMethodName(), Integer.valueOf(stack.getLineNumber())}) + ":<--->:";
}
public void ToastSHORT(String msg) {
Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_SHORT);
}
public void ToastLONG(String msg) {
Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_LONG);
}
public void LogI(String msg) {
Log.i(LOG_TAG, buildHeader() +""+ msg);
}
动态权限申请
使用效果
extends BaseActivity
//如果谁能做到不用手动指定Manifest.permission.WRITE_EXTERNAL_STORAGE
//通过系统自动拒绝自动获取再去申请请告诉我
CheckPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, new BaseActivity.CheckPermissionOk() {
@Override
public void ok() {
//实行需要高权限的方法
}
@Override
public void denied() {
ToastSHORT("该功能需要XX权限已被拒绝,需在设置重新开启!");
}
@Override
public void nok() {
ToastSHORT("已成功禁止,相关功能将不可用!");
}
});
实现代码
BaseActivity extends Activity
private final int REQUEST_CODE = 0x123;
public interface CheckPermissionOk {
void ok();
void denied();
void nok();
}
private CheckPermissionOk okImpls;
public void CheckPermission(String permission, CheckPermissionOk okImpl) {
okImpls = okImpl;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//无需要检查权限
if (okImpls != null) {
okImpls.ok();
}
return;
}
//检查权限
if (ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限.
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
//已经禁止提示了
if (okImpls != null) {
okImpls.denied();
}
} else {
ActivityCompat.requestPermissions(this, new String[]{permission}, REQUEST_CODE);
}
} else {
//有权限
if (okImpls != null) {
okImpls.ok();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//用户同意授权
if (okImpls != null) {
okImpls.ok();
}
} else {
//用户拒绝授权
okImpls.nok();
}
break;
}
}
findViewById
这个东西在 Butterknife之后就太小儿科了….233
public abstract class BaseActivity extends Activity
//fid的简化
public <T extends View> T Fid(int id) {
T tView = (T) findViewById(id);
return tView;
}
/**
* like Cid(textView1,R.id.tv1).Cid(textView2,R.id.tv2)
* @param tVIew
* @param id
* @param <T>
* @return
*/
public <T extends View> BaseActivity Cid(T tVIew, int id) {
tVIew = Fid(id);
return this;
}