【Android】看安卓代码的一点笔记
最近项目需要把安卓项目拉下来看了
简单来说的话,网页是HTML + CSS + JS 组成的,运行环境是浏览器上面
安卓APP应用是 Java + XML 组成的,运行环境是这个安卓系统中
构成结构
每一个Activity.xml 相当于一个页面 【也可以是一个组件片段】
Activity.xml 能够配置好布局,视图控件,样式这些东西,都在xml标签中标记好
对应JS动态控制是对应的一个Activity类,这个类来编写对Activity的控制
这个类一定会有这个onCreate生命周期
在这生命周期中将Activity.xml和类进行绑定:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_keliu_layout); init(); }
对于一般Java代码来说,这个R类应该可以在文件中找到,但是发现并没有
https://blog.csdn.net/weixin_43858561/article/details/88865836
R是一个安卓自动编译生成的一个类,类中的内容映射所有的Activity.xml,这个类是不可更改的
Activity类,需要监听事件,Web页面直接使用JS获取元素调用addEventListener入参一个函数即可
但是安卓这边就是以Java的方式来实现,首先这个类需要实现Listener接口,然后重写接口方法
看了下代码,这个入参的View是Activity.xml里面的一个标签空间,可以是按钮,输入框这样的
当点击了某一个东西的时候,把这个View对象入参
通过ID来判断是哪一个View对象被点击了
然后再执行对应的操作逻辑
这样一一对应的,ID在不同的Activity中可以名称重复,因为可以根据Activity的名称来下一级引用
好像安卓是id没有分Activity放在一起的,虽然说id是唯一的,但是引用的变量名称是一样的
请求交互
由于是Java代码编写开发,肯定需要Http协议通信的一套组件
这里看的是简单封装了些方法供调用,可能是ApacheHttpClient的底层
根据响应状态判断,成功在上面,失败就在下面
Webview访问
甲方天马行空的需求,要进行APP合并,所有APP都合并在一个APP中
现在情况是 应用A是安卓代码写的,应用B是H5页面,应用C又是Vue开发的
这边只能根据安卓这个API来实现,就是Webview控件,可以把资源向浏览器一样打开访问
这里展示的是功能跳转,在这个类中实现的Webview
先是onCreate生命周期,这里用方法封装了下,处理的内容太多了
在这里一段内容
这里就是我们应用B和应用C的目录
private final String ASSETPATH = "file:///android_asset/"
DMS系统需要交互的令牌和其他信息都只能通过URL传参的形式进行
这样就可以在安卓应用中访问这个内部的应用
同理在苹果应用也是类似的方式实现
安卓接口开放JS调用
在手机中这种方式,我们应用B 和C是浏览器方式操作的,对应移动端的一些底层硬件访问是有权限阻挡的
例如,访问手机系统的文件,打开照相机拍照返回照相文件,开启录音,等等这些
这种方式B和C是不能通过自身JS来调用,所以需要安卓应用开放接口给JS调用
例如手机拨号这个功能:
这是个自定义的一个内部类:
可以看到这些方法都注解了@JavaScriptInterface JS接口
/** * 自己写一个类,里面是提供给H5访问的方法 * */ public class JsInteration{ /** * 注销系统 * @param val */ @JavascriptInterface//一定要写,不然H5调不到这个方法 public void exitSystem(String val) { SuperLogUtils.e("网页传来传的值:", val); exitTheSystem(); //return "我是java里的方法返回值"; } /** * 打开外部浏览器进行浏览HTML * @param url */ @JavascriptInterface public void openHtml(String url){ Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse(url); intent.setData(content_url); startActivity(intent); } /** * 拨打电话(跳转到拨号界面,用户手动点击拨打) * * @param phoneNum 电话号码 */ @JavascriptInterface public void callPhone(String phoneNum) { SuperLogUtils.e("网页传来传的值phoneNum:", phoneNum); Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + phoneNum); intent.setData(data); startActivity(intent); } @JavascriptInterface public Map<String,Object> htmlGetMapAddress(){ Map<String,Object> map = new HashMap<>(); map = getMapAddress(); if(map!=null){ return map; }else{ map.put("msg","未获取到时实位置!!!"); return map; } } @JavascriptInterface public void getTakePhoto(){ File fileUri = new File(Environment.getExternalStorageDirectory().getPath() + "/" + SystemClock.currentThreadTimeMillis() + ".jpg"); imageUri = Uri.fromFile(fileUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { imageUri = FileProvider.getUriForFile(ServiceAppH5Activity.this, getPackageName() + ".fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri } PhotoUtils.takePicture(ServiceAppH5Activity.this, imageUri, PHOTO_REQUEST); } }
这边H5的APP应用就是这样的写法调用安卓的: