在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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
因为我们的ButterKnife在每个Activity中的绑定与解绑操作都是一样的,所以将其封装成一个BaseActivity抽象类。再来看看我们的使用:
public class TestActivity extends BaseActivity {
@BindView(R.id.tv_test)
TextView mTextView;
@Override
public int getContentViewResId() {
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
其实BaseActivity跟BaseFragment的差别不大,唯一就是在ButterKnife在初始化需要有点不同。这里不再过多阐述。接下来我们说说终极版的兼容6.0权限操作的BaseActivity。
终极版兼容6.0运行时权限的BaseActivity
public abstract class BaseActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {
private Unbinder mUnbinder;
/**
* 需要进行检测的权限数组
*/
protected String[] mNeedPermissions = {
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
解释一下代码:1.首先我们在 onCreate
中通过checkPermissions(mNeedPermissions)
检查我们需要的权限,在checkPermissions
中会调用findDeniedPermissions
来寻找我们哪些权限是需要去申请的,然后调用ActivityCompat.requestPermissions
去申请权限,申请权限会在onRequestPermissionsResult
中回到,我们再调用verifyPermissions
来确认是否所有的权限已被准许,如果没有调用showMissingPermissionDialog
来告知用户权限确实。
最后我们在使用的时候只需要继承BaseActivity,重写mNeedPermissions这个成员变量即可。而不需要每次在需要申请权限的Activity里面写一大堆臃肿的代码。BaseFragment与BaseActivity同理哟!