木鸟杂记

分布式系统,数据库,存储

Android 学习笔记(二):代码组织

问题

在进行模块化的时候,试图将诸如SearchListener, CallManager 的模块从MainActivity中拆出来,然而在响应事件的时候,不可避免的需要改变其他资源状态,那么就需要获取其句柄。由此还需要把MainActivity作为句柄传入代码。

更令人纠结的是,由于存在一些异步事件(如申请权限),其触发在模块(CallManager)中,其接受在主体视图(MainActivity)中,又需要将保有的参数重新传回MainActivity,如此绕来绕去,让我不禁反思我模块化时候存在的问题。

作者:木鸟杂记 https://www.qtmuniao.com, 转载请注明出处

细节

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
CallManager.java

public boolean playCall(String phoneNumber) {
if (ContextCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.CALL_PHONE},
CALL_PHONE_REQUEST);

MainActivity ma = (MainActivity) activity;
**ma.setPhoneNumber(phoneNumber);**

return false;
...
}

MainActivity.java

private String phoneNumber = null;
public void setPhoneNumber(String number) {this.phoneNumber = number;}
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case CallManager.CALL_PHONE_REQUEST:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

if (phoneNumber != null ) {
CallManager callManager = new CallManager(this);
callManager.playCall(phoneNumber);

}
}
break;

...
}
}

Activity中接收到call event调用CallManager,然后在其中请求权限,利用Set方法,将PhoneNumber传回Activity。初步想法是可以将请求权限、被授予权限后执行回调函数这种和Activity紧耦合的代码方法写在MainActivity中,然后CallManager只处理call逻辑。但仍需要一个类变量来保存电话号码,以进行从请求权限到执行回调之前的参数传递工作。


我是青藤木鸟,一个喜欢摄影、专注大规模数据系统的程序员,欢迎关注我的公众号:“木鸟杂记”,有更多的分布式系统、存储和数据库相关的文章,欢迎关注。 关注公众号后,回复“资料”可以获取我总结一份分布式数据库学习资料。 回复“优惠券”可以获取我的大规模数据系统付费专栏《系统日知录》的八折优惠券。

我们还有相关的分布式系统和数据库的群,可以添加我的微信号:qtmuniao,我拉你入群。加我时记得备注:“分布式系统群”。 另外,如果你不想加群,还有一个分布式系统和数据库的论坛(点这里),欢迎来玩耍。

wx-distributed-system-s.jpg