您的位置:首页 > 移动开发 > Android开发

Android结合ButterKnife创建自己的BaseActivity

2017-11-17 16:17 302 查看
在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() {
// 此处返回你Activity的contentViewId
return R.layout.activity_test;
}

@Override
public void init(Bundle savedInstanceState) {
// 此处进行初始化操作
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

是不是加入了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 = {
// 这里填你需要申请的权限
// 如:读取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
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同理哟!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: