【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应用就是这样的写法调用安卓的:

 

posted @ 2021-09-15 10:38  emdzz  阅读(184)  评论(0编辑  收藏  举报