在Android开发中,我们需要创建一个BaseActivity来方便对APP中所有的activity进行统一操作。今天我们就来说说如何结合ButterKnife来打造一个加强版的BaseActivity。不熟悉ButterKnife的朋友可以参考我这篇文章 Android之ButterKnife用法详解 。
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
private Unbinder mUnbinder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewResId());
mUnbinder = ButterKnife.bind(this);
init(savedInstanceState);
}
public abstract int getContentViewResId();
public abstract void init(Bundle savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
}
因为我们的ButterKnife在每个Activity中的绑定与解绑操作都是一样的,所以将其封装成一个BaseActivity抽象类。再来看看我们的使用:
public class TestActivity extends BaseActivity {
@BindView(R.id.tv_test)
TextView mTextView;
@Override
public int getContentViewResId() {
// 此处返回你Activity的contentViewId
return R.layout.activity_test;
}
@Override
public void init(Bundle savedInstanceState) {
// 此处进行初始化操作
}
}
是不是加入了ButterKnife之后,我们使用起来就特别方便了
接下来看看BaseFragment
public abstract class BaseFragment extends Fragment {
public static final String TAG = BaseFragment.class.getSimpleName();
private View mRootView;
private Unbinder mUnbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mRootView = inflater.inflate(getLayoutResId(), container, false);
mUnbinder = ButterKnife.bind(this, mRootView);
init(savedInstanceState);
return mRootView;
}
public abstract void init(Bundle savedInstanceState);
public abstract int getLayoutResId();
@Override
public void onDestroyView() {
super.onDestroyView();
mUnbinder.unbind();
}
}
其实BaseActivity跟BaseFragment的差别不大,唯一就是在ButterKnife在初始化需要有点不同。这里不再过多阐述。接下来我们说说终极版的兼容6.0权限操作的BaseActivity。
终极版兼容6.0运行时权限的BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {
private Unbinder mUnbinder;
/**
* 需要进行检测的权限数组
*/
protected String[] mNeedPermissions = {
// 这里填你需要申请的权限
// 如:读取sd卡
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
};
private static final int PERMISSION_REQUEST_CODE = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewResId());
mUnbinder = ButterKnife.bind(this);
checkPermissions(mNeedPermissions);
init(savedInstanceState);
}
/**
* @param permissions
*/
private void checkPermissions(String... permissions) {
List<String> needRequestPermissionList = findDeniedPermissions(permissions);
if (null != needRequestPermissionList
&& needRequestPermissionList.size() > 0) {
ActivityCompat.requestPermissions(this,
needRequestPermissionList.toArray(
new String[needRequestPermissionList.size()]),
PERMISSION_REQUEST_CODE);
}
}
/**
* 获取权限集中需要申请权限的列表
*
* @param permissions
* @return
*/
private List<String> findDeniedPermissions(String[] permissions) {
List<String> needRequestPermissionList = new ArrayList<String>();
for (String perm : permissions) {
if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) {
needRequestPermissionList.add(perm);
}
}
return needRequestPermissionList;
}
/**
* 检测是否说有的权限都已经授权
*
* @param grantResults
* @return
*/
private boolean verifyPermissions(int[] grantResults) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 显示提示信息
*
*/
private void showMissingPermissionDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.notifyTitle);
builder.setMessage(R.string.notifyMsg);
// 拒绝, 退出应用
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setPositiveButton(R.string.setting,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();
}
});
builder.setCancelable(false);
builder.show();
}
/**
* 启动应用的设置
*
*/
private void startAppSettings() {
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (!verifyPermissions(grantResults)) {
showMissingPermissionDialog();
}
}
}
public abstract int getContentViewResId();
public abstract void init(Bundle savedInstanceState);
@Override
protected void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
}
解释一下代码:1.首先我们在 onCreate
中通过checkPermissions(mNeedPermissions)
检查我们需要的权限,在checkPermissions
中会调用findDeniedPermissions
来寻找我们哪些权限是需要去申请的,然后调用ActivityCompat.requestPermissions
去申请权限,申请权限会在onRequestPermissionsResult
中回到,我们再调用verifyPermissions
来确认是否所有的权限已被准许,如果没有调用showMissingPermissionDialog
来告知用户权限确实。
最后我们在使用的时候只需要继承BaseActivity,重写mNeedPermissions这个成员变量即可。而不需要每次在需要申请权限的Activity里面写一大堆臃肿的代码。BaseFragment与BaseActivity同理哟!