美文网首页
《Android编程权威指南》第30~32以及第34章读书笔记

《Android编程权威指南》第30~32以及第34章读书笔记

作者: EmanLu | 来源:发表于2016-12-07 15:22 被阅读20次
    配置文件中的broadcast receiver
    <receiver android:name="XXX">
        <intent-filter>
        </intent-filter>
    </receiver>
    

    在配置文件中完成声明后,即使应用当前并未运行,只要有匹配的broadcast intent的发来,broadcast receiver就会接收。收到intent后,onReceiver(...)就会运行,然后broadcast receiver被销毁。

    发送broadcast intent

    1.创建intent,intent中定义动作action;
    2.sendBrocast(Intent)。

    动态broadcast receiver

    使用
    1.在代码中注册receiver,调用registerReceiver(BroadcastReceiver,IntentFilter);
    注意:IntentFilter可调用addCategory(String)、addAction(String)和addDataPath(String)等方法达到和在xml中配置intent-filter同样的效果。
    2.取消注册,调用unregisterReceiver(BroadcastReceiver,IntentFilter)。
    注意:这两个方法是对应的,有注册就一定要取消注册。

    接收范围
    一般来说,broadcast receiver是可以被系统中的任何应用监听和触发的。

    将其限制在应用内部内使用:
    1.receiver声明在配置文件中,在receiver标签上添加android:exported="false";
    2.创建并使用私有权限。

    创建并使用私有权限

    创建私有权限:
    在配置文件中使用<permission>标签:
    1.权限名;
    2.protectionLevel:确定私有权限使用方式,仅限于内部应用使用权限通常用signature。
    eg:<permission android:name="权限名"
    android:protectionLevel="signature"/>

    使用:
    1.在配置文件中声明使用私有权限,eg:<uses-permission android:name="权限名"/>;
    2.发送带有权限的broadcast:调用sendBroadcast(...,权限名);
    3.接收:调用registerReceiver(...,权限名,...)。

    protectionLevel属性值:


    protectionLevel
    receiver与长时运行任务

    在receiver中进行耗时操作:
    1.将耗时操作交到Service中处理,通过broadcast receiver启动Service;
    2.使用BroadcastReceiver.goAsync(),该方法返回一个BroadcastReceiver.PendingResult对象,使用该对象提供结果。存在不支持旧设备和不灵活的缺点。

    网页浏览

    1.使用隐式Intent启动系统浏览器,并在其中打开URL指向的网页;
    2.使用WebView。

    WebView的使用

    1.布局中添加WebView控件;
    2.配置WebView设置:
    ① 调用getSetting()获得WebSettings实例;
    ② 调用方法完成设置,如WebSettings.setJavaScriptEnabled(true)启用JavaScript;
    3.配置WebViewClient,通过setWebViewClient(WebViewClient)去覆盖里面要实现的方法,其中shouldOverrideUrlLoading(...),返回true,表示WebView不处理传入的url,交由默认的WebViewClient也就是系统浏览器处理,返回false,表示交由WebView处理;
    4.要在2.完成之后才进行,调用loadUrl(String url)加载网页(当然3.中的shouldOverrideUrlLoading(...)返回true的话,这个方法等于不起作用了)。

    自定义View和触摸事件

    分类

    • 简单视图:可以有复杂的内部,不包含子视图,基本都执行定制绘制;
    • 聚合视图:由一些其它视图对象组成。通常管理者子视图,但不负责执行定制绘制,图形绘制任务都交给了各个子视图。

    步骤

    • 选择超类。简单视图,View就是空白画布,而聚合视图则应该选择好合适的布局类;
    • 继承选定的超类,并至少覆盖一个超类构造方法,或者在自定义的构造方法里,调用超类的构造方法;
    • 覆盖其它关键方法,以定制视图行为。

    注意:在布局文件使用android.view和android.widget包之外的自定义View的时候,必须使用全路径类名,这样布局inflater才能找到自定义View来解析。

    处理触摸事件
    一般设置触摸事件监听器:

    public void setOnTouchListener(View.OnTouchListener l)
    

    而自定义View可以直接覆盖:

    public boolean onTouchEvent(MotionEvent event)
    

    MotionEvent可以用来描述包括位置和动作的触摸事件,MotionEvent对象调用getAction()获得动作值。通常是以下四个动作:

    • ACTION_DOWN:用户手指触摸到屏幕;
    • ACTION_MOVE:用户在屏幕上移动手指;
    • ACTION_UP:用户手指离开屏幕;
    • ACTION_CANCEL:父View拦截了触摸事件。

    onDraw(...)内的图形绘制
    自定义View覆盖:

    protected void onDraw(Canvas canvas)
    
    • Canvas类具有需要的所有绘制操作。其方法可指定绘制的位置和图形,例如线条、圆形、矩形等;
    • Paint类决定如何进行绘制操作。其方法可指定绘制图形的特征,例如是否填充图形,使用什么字体进行绘制等。
    使用SQLite本地数据库

    Android内置了操作SQLite的Java前端,该前端的SQLiteDatabase类负责提供Cursor实例形式的结果集。

    Android提供了一个SQLiteOpenHelper帮助类,里面封装了一些存储应用数据的常用数据库操作,如创建、打开以及更新数据库等。

    实现SQLiteOpenHelper的子类需要覆盖两个方法:

    • onCreate(SQLiteDatabase):为新建数据库创建表结构;
    • onUpgrade(SQLiteDatabase, int, int):执行迁移代码,实现不同版本间的数据库结构升级或转换。

    SQLiteOpenHelper类有两个访问SQLiteDatabase实例的方法:

    • getWritableDatabase():需要可写模式数据库时使用;
    • getReadableDatabase():需要只读模式数据库时使用。

    一般来说,对于既定的SQLiteOpenHelper类实例,两者的调用,返回的SQLiteOpenHelper类实例是一样的,但在某些情况,如磁盘空间满了,可能无法获得可写数据库,只能获得只读数据库。

    查询SQLiteDatabase可返回描述结果的|Cursor实例。Cursor将结果集看作一系列的数据行和数据列,但仅支持String以及基本数据类型的值。

    相关文章

      网友评论

          本文标题:《Android编程权威指南》第30~32以及第34章读书笔记

          本文链接:https://www.haomeiwen.com/subject/jiedmttx.html