zoukankan      html  css  js  c++  java
  • 《第一行代码》读书笔记三

    一:网络技术

    1:WebView

    我们可以在程序中内嵌一个浏览器,用于展示各种各样的网页。【还有一种用法:用webview来展示webapp】

    使用步骤:在布局文件中引入一个webview控件——在代码中为webview控件设置浏览器属性、代理模式、loadUrl设置打开的网页等——在AndroidManifest.xml中注册网络权限

    2:网络请求:使用okhttp框架

    3:解析网络响应数据

    Json数据:使用Gson库或者FastJson

    XML数据:使用Xstream

    二:多线程

    android多线程的使用步骤:

    法一:继承Thread,定义线程类,重写run()方法执行耗时逻辑——在其他地方新建线程类实例——线程实例.start()启动线程

    法二:实现Runnable接口,定义线程类,重写run()方法——用runnable实例作参数,新建Thread线程实例——start()启动线程

    子线程中操作UI:

    法一:消息传递机制——handler:主线程创建handler,重写handleMessage方法处理消息,更新UI——子线程中发送消息

    法二:使用AsyncTask:定义一个异步任务类继承自AsyncTask——重写其中的几个方法,定义异步任务执行前、执行时、执行后的回调方法,在某些方法中操作UI——在其他地方创建异步任务类实例,通过execute()方法启动异步任务

    法三:使用  runOnUiThread(new Runnalbe(){重写run方法})  方法,在重写的run方法中操作UI

    三:服务

    1:服务依赖于创建它的应用程序,当进程被杀死时,所有依赖于该进程的服务都会停止。

    2:服务默认是运行在主线程中的,因此,虽然服务是在后台运行,但是如果需要执行耗时操作,也要在服务中开启子线程来执行耗时操作。

    3:服务自己停止:在服务中调用stopSelf()即可。

    4:服务的基本使用:

    继承Service定义服务类,重写其中的几个方法,定义服务要执行的操作——在AndroidManifest.xml中注册服务——在activity中创建intent,通过intent启动服务——通过intent停止服务

    5:活动与服务的通信调用:

    继承Service定义服务类:服务类中继承Binder定义一个内部类,binder类中定义需要被活动调用的方法;服务类中创建binder类实例,并且在onBind()方法中返回这个binder——在activity代码中,创建一个ServiceConnection实例,重写其中的两个方法,分别对应服务绑定成功与失败两种情况的回调,其中绑定成功回调方法中获取到binder实例——在activity中通过intent和connection实例作为参数,绑定服务——在activity中通过binder实例调用Binder类中定义的方法——在activity中通过connection实例作为参数,解绑服务

    6:服务的高级用法:

    前台服务:在定义服务类时,重写onCreate()方法,在其中创建一个通知,并让通知显示,这样在服务被创建时就会在显示一个前台通知了。

    执行耗时操作的服务——IntentService类:异步的、异步操作完成后会自动停止的服务。

    继承IntentService类定义一个异步服务类——重写两个方法,其中:onHandleIntent()方法中执行耗时操作,这个方法会自动在子线程中执行,因此不会导致ANR;onDestroy()方法会在onHandleIntent()方法执行完毕后自动调用,自动停止服务——在activity中通过intent,启动异步服务类

    四:LBS——基于位置的服务

    1:定位的实现:通过手机的GPS定位;通过附近的三个网络基站计算定位。

    2:实际应用:多采用高德地图SDK或者百度地图SDK来进行定位、描点、规划路线等。

    五:进阶技巧

    1:使用Intent传递对象

    法一:序列化

    定义实体类时,实现Serializable接口,这样的创建出来的类对象就可以在intent中携带了

    //携带对象
    intent.putExtra("key",obj)
    
    //提取对象
    CLassName  obj = (ClassName)getIntent().getSerializableExtra("key")

    法二:Parcelable

     Parcelable把一个完整的对象进行分解,分解的每一部分都是可以被intent携带的基本数据类型。

    定义实体类时,实现Parcelable接口——重写writeToParcel(Parcel dest)方法,通过dest.writeXX(类成员变量)来决定要分解、输出哪些内容——定义Creator常量,重写其中的createFromParcel(Parcel source)方法,从source中提取被分解掉内容,重新创建出一个类对象并返回

    //携带对象
    intent.putExtra("key",obj)
    
    //提取对象
    CLassName  obj = (ClassName)getIntent().getParcelableExtra("key")

    2:超级实用技巧——订制日志工具:开发调试、故障诊断时打印关键数据,上线后不打印

    新建一个工具类,LogUtil:

    import android.util.Log;
    
    /**
     * Created by yeguojian on 2017/10/12.
     */
    
    public class LogUtil {
        //定义6个级别
        public static final int VERBOSE = 1;
        public static final int DEBUG = 2;
        public static final int INFO = 3;
        public static final int WARN = 4;
        public static final int ERROR = 5;
        public static final int NOTHING = 6;
        
        //控制允许打印的最低级别
        public static int level = VERBOSE; 
        
       public static void v(String tag,String msg){
            if(level<=VERBOSE){
                Log.v(tag,msg);
            }
        }
        public static void d(String tag,String msg){
            if(level<=DEBUG){
                Log.d(tag,msg);
            }
        }
        public static void i(String tag,String msg){
            if(level<=INFO){
                Log.i(tag,msg);
            }
        }
        public static void w(String tag,String msg){
            if(level<=WARN){
                Log.w(tag,msg);
            }
        }
        public static void e(String tag,String msg){
            if(level<=ERROR){
                Log.e(tag,msg);
            }
        }
    }

    之后,在其他需要打印日志的地方,使用:

    LogUtil.XX("tag","msg") //XX为具体打印函数

    进行打印;

    在调试、故障排查时,我们只需把LogUtil的level改低,即可看到打印信息;要上线使用时,level设置为NOTHING,即可无打印。

    3:Doze模式简介

    Android 6.0以上的设备,未连接电源并且关闭了屏幕一段时间后,就进入了Doze模式。

    Doze模式下,系统会限制CPU、网络、Alarm等活动。

    系统采取间歇性退出Doze模式的策略,让应用可以完成数据同步、alarm定时任务等。

    因此,如果需要精确的定时任务,则需要通过AlarmManager的setAndAllowWhileIdle()或setExactAndAllowWhileIdle()方法设置Doze模式下也能工作的定时任务。

    4:多窗口分屏

    android6.0之后增加了分屏功能:打开一个应用后,长按底部虚拟导航栏的最右边overview按钮,进入分屏。

    分屏后的生命周期:用户交互哪边屏幕的活动,该活动就处于运行状态,另一边屏幕的活动就变成了暂停状态。

    禁用分屏:想要自己的应用禁止分屏模式,只需在AndroidManifest.xml中配置一下即可:application或activity标签添加属性:android:resizeableActivity="false"

    禁用横屏:android:screenOrientation="portrait"(意思是:只支持竖屏)

    5:Lambda表达式:同RN里的箭头函数。

    6:定时任务——Alarm

    获取定时任务管理器实例:AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

    设置定时任务:manager.set(工作类型,触发时间,触发pendingIntent)

    长时间重复执行的定时任务(轮询):

    新建一个服务,继承自Service——重写onStartCommand()方法,在其中新建一个线程,run()方法中执行具体的执行任务,并且start;然后获取alarmManager实例,设置多少间隔后的定时任务,pendingIntent为调用该服务类.class(调用自身:即定时重启服务,而服务启动时会创建子线程执行具体逻辑);最后,return super.onStartCommand(intent,flag,startID)。

  • 相关阅读:
    平衡二叉树
    二叉搜索树的最近公共祖先
    U-Boot> help, 命令集
    sprintf_s函数用法
    用keil编写的 C51错误 *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_START
    GPS时间系统概述和世界时系统
    浅析gcc、arm-linux-gcc和arm-elf-gcc关系
    如何删除电脑中使用过的COM端口
    飞鸽传书 绑定指定网卡
    UE 高亮 一个或多个关键字的方法
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7638633.html
Copyright © 2011-2022 走看看