Android结合ButterKnife创建自己的BaseActivity(兼容6.0)
2017-06-01 15:53
399 查看
在Android开发中,我们需要创建一个BaseActivity来方便对APP中所有的activity进行统一操作。今天我们就来说说如何结合ButterKnife来打造一个加强版的BaseActivity。不熟悉ButterKnife的朋友可以参考我这篇文章 Android之ButterKnife用法详解 。
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抽象类。再来看看我们的使用:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
是不是加入了ButterKnife之后,我们使用起来就特别方便了
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。
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.首先我们在
最后我们在使用的时候只需要继承BaseActivity,重写mNeedPermissions这个成员变量即可。而不需要每次在需要申请权限的Activity里面写一大堆臃肿的代码。BaseFragment与BaseActivity同理哟!
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同理哟!
相关文章推荐
- Android结合ButterKnife创建自己的BaseActivity(兼容6.0)
- Android结合ButterKnife创建自己的BaseActivity
- Android 6.0 AMS分析的第二条线:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互等知识;
- 抽取ButterKnife到BaseActivity
- android 让自己的Activity只创建一个实例
- Android开发之ButterKnife,GreenDao简单运用,以及推荐并使用一个好用的开源库BaseRecyclerViewAdapterHelper。
- Android 仿ButterKnife写自己的IOC注解框架
- BaseActivity+ButterKnife 地图在onDestroy中执行mMapView.onDestroy()遇到空指针的问题
- Android-自己动手写ButterKnife与原理解析
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
- Android开发,实用的BaseActivity的创建及使用
- 创建兼容android activity的OSGI bundle
- android在aidl文件导入自己创建的类
- Android Fragment---给Activity创建事件回调
- Android开发--创建Activity 要点、注册
- android开发创建Activity时会把标题栏去掉
- Android学习札记40:关于安全退出已创建多个Activity的应用(3)
- android完美退出程序(创建单例管理所有打开的activity)
- Android Fragment---给Activity创建事件回调
- Android中ListView,SQLite,BaseAdapter的结合