首页 资讯 社群 我的社区 搜索

Android入门总结

高大上
2019-05-04 16:08:43

最近打算接手的项目其中一个模块涉及到Android开发,突击速成了一下!这里记录下一些概念性的东西,同时记录下一些常用的demo代码:

【基本概念】

问题一:安卓是什么?它和java是什么关系?

答:Android是Google基于linux内核开发的一套适合移动设备的操作系统,你可以认为就是一个缩小版的linux系统。而安卓开发基本都是在内核系统之上做api调用,而这些api是用java写的。java做不了的,则使用native方法补充。所以很多人都说Android就是java。

但是我个人感觉,Android开发的难度是要高于java初级的。java初级能做的事情比较广,但是深度相对较浅。而Android则属于窄而深的类型。Android开发中几乎到处都是继承,重载,多线程以及内部类。这些对于初学者来说还是有难度的,会用它不代表你理解了它。对于有java基础的人来说学起来还是很轻松的,而且对于java初级水平的同学来说会是一个很好的提升。

问题二:学习中最大的难点是什么?

答:应该是环境的搭建,我当时安装SDK和Android模拟器差不多折腾了2天。Android本身的开源的,因此它发展的非常快。这就造成了SDK版本间会有比较大的差异。而百度上好多不加验证的抄袭贴会对初学者产生比较大的误导。建议入门还是看视频比较好,入门后就可以看资料来学习了。基础概念远比API调用重要。

问题三:Android代码和java代码的区别是什么?

答:从语法上来说他们是一样的,完全一样。但是android因为其特殊的运行环境会有一些写法在Java中看来是不规范的地方。例如active中会大量出现全局变量和多线程。这是用为android认为同一时间用户能操作的界面只会有一个,同时为了保证效率。它没有使用JVM,而是使用Dalvik虚拟机,它最大的特点就是会在预加载时加载全部的资源变量。同时不允许在ui线程,也就是在active中做耗时操作。因此大量的全局变量和多线程调用就出现了。

【Android知识体系】

1.四大组件:active用于做用户看得见的部分,service用来做看不见的部分,broadcastReceiver用于做消息广播,而ContentProvide更像是一种数据代理,可以通过它来做跨程序间的数据交互。

2.active,也就是界面布局时一门很深的学问,没个一年半载肯定驾驭不了。如果你的app更多的是后端开发,可以考虑使用WebView来替代active布局。WebView允许用户将html和js嵌入app中。对于有web端开发经验的人来说起码能节省你50%的学习时间和工作量。

3.service,负责后台业务。所有用户不能直接接触的都可以考虑用它来做。service可以大致分为三种:1.startService 会创建后台服务,页面,甚至app被关掉都不会停止服务的运行(这个是我项目中最优先考虑使用的)。2.bindservice 会和页面共存亡,页面被关闭则自动销毁。3.IntentService 适用于定时处理,但是有希望消息是按顺序排列的情况,例如qq定时后台获取消息

4.BroadcastReceiver 广播(通知消息)接收器。用法类似js中事件驱动中的回调函数。可以在指定广播消息后处理自己的业务。例如:网络切换或者收到电话时唤醒自己的程序。注意:广播中不允许开线程,因此不能做过多的逻辑处理,如果执行时间超过10秒就会ANR.

5.ContentProvide 作用是跨程序间的数据交互。安卓中的通讯录等等内置功能本身也是一个app,通过ContentProvide能很方般的共享数据。它其中引入了一个叫uri的概念,在Android中的所有数据都是以单文件的形式存在的,这些文件基本都存在在自己的app目录下。ContentProvide会对所有的文件进行编码索引分配uri,其他程序可以通过ContentProvide调用对应的uri来获取数据。

6.数据持久化,安卓中的持久化数据都是以单文件形式存在的。这些文件一般就在app自己的目录下面。常见的持久化方式有3中:1.以文件形式保存,和java中一模一样。2.使用SharedPreferences,这个是sdk提供的对象,它会将数据以xml文件的形式保存起来。3.使用SQLite,一种小型的数据库,但是也满足sql规范。

7.目录结构,Android项目有着严格的结构体系。主要表现在两个方面:1.它所有的组件,ui元素等都需要继承或者实现特定的接口才能生效。而各个代码片段间的交互也需要通过特定的类来协调,例如Handler。这就是我说它“窄而深”的原因;2.它的包名称也有严格的规范,例如 assets 资源文件夹,这个目录下允许有其他的目录结构,里面的文件会被原样打包的apk中。通过getAssets()可以拿到对应的操作对象。res 资源文件夹,这也是一个资源文件夹,区别是res中的文件会被R索引,assets则不会。res下的文件夹只能是固定的几个文件夹名称。例如:存放布局文件的layout,存放资源的raw等等,同时SDK提供了一些native方法,例如getResources().openRawResource()来帮我们直接读取这些文件

8.AndroidManifest.xml 这个文件可以申明app的名称,版本,log等,同时所有的组件和app权限都需要在这个文件中申明。我一般将它理解为servlet中的web.xml

【代码干货】

因为我的项目中大部分要做的是对Android设备的管控,所以使用WebView来替代active布局。这里重点介绍下Android代码如何和js相互调用。

1.Android调用js,通过evaluateJavascript,注意该方法仅在4.4以后才能用,现在都9了,基本都能用。起码公司的测试机都5.1了

package com.example.hcy.demo3;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;

import com.example.hcy.demo3.TestWebView.MyObject;


public class NetworkTest extends AppCompatActivity implements View.OnClickListener {
    private WebView webView;
    private Button calljs;
    private String url ;

    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_network_test);
        webView = findViewById(R.id.web);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);//允许js交互
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹框
        webSettings.setDefaultTextEncodingName("UTF-8");//设置java和js交互时的默认字符集
        webView.loadUrl("file:///android_asset/Web/index.html");//加载网页
        webView.addJavascriptInterface(new MyObject(NetworkTest.this),"myObj");//设置java和js代码映射


        //android调用 js
        calljs = findViewById(R.id.calljs);
        calljs.setOnClickListener(this);
        // 由于设置了弹窗检验调用结果,所以需要支持js对话框
        // webview只是载体,内容的渲染需要使用webviewChromClient类去实现
        // 通过设置WebChromeClient对象处理JavaScript的对话框
        //设置响应js 的Alert()函数
        //如果没有下面的方法则js可以执行并返回结果,但是不会有弹出框
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b = new AlertDialog.Builder(NetworkTest.this);
                b.setTitle("Alert");
                b.setMessage(message);
                b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        result.confirm();
                    }
                });
                b.setCancelable(false);
                b.create().show();
                return true;
            }

        });



    }

    //因为evaluateJavascript方法只能在安卓4.4以后才能用,该注解会申明该方法在SDK19以下版本被忽略
    @TargetApi(Build.VERSION_CODES.KITKAT)
    @Override
    public void onClick(View v) {
        webView.evaluateJavascript("javascript:showhcy2()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                System.out.println("返回js的结果---"+value);
            }
        });
    }
}

其中的evaluateJavascript("javascript:showhcy2()"){} 对应js中要调用的方法名称

 

2.js调用android,通过addJavascriptInterface来绑定映射,代码和上面的demo差不多,上面也有写。

 

未完待续----

 

用户评论