【安卓】

1. 安装APK记得考虑兼容7.0,Uri不能直接从Uri.parse()中构建,要使用FileProvider构建Uri。

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_path" />
</provider>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- /storage/emulated/0/Download/下的文件可以访问 -->
    <external-path
        name="beta_external_path"
        path="Download/" />

    <!--/storage/emulated/0/Android/data/下的文件可以访问 -->
    <external-path
        name="beta_external_files_path"
        path="Android/data/" />
</paths>
public static void installAPK(Context context, String apkPath) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    // 7.0以上要这样把文件提供给外部应用程序
    Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", new File(apkPath));
    // 7.0以上不能像下面那样访问文件了(注释)
    // intent.setDataAndType(Uri.parse("file://" + apkPath), "application/vnd.android.package-archive");
    intent.setDataAndType(uri, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    context.startActivity(intent);
}

2. FLAG_ACTIVITY_NEW_TASK与taskAffinity的配合使用(规则要谨记:直接将任务栈移到前台显示,任务栈状态不变)

/*
任务栈1:
ActivityA > ActivityB

任务栈2:
ActivityC > ActivityD

1. 如果ActivityB启动了ActivityC,任务栈2直接回到前台显示,显示的是ActivityD。

2. 如果ActivityB启动了ActivityE(ActivityE的taskAffinity属于任务栈2),任务栈2回到前台,ActivityE创建并显示。
*/

【前端】

1. table-cell的使用,table-cell内有浮动元素和普通inline-block元素在垂直居中的特点(是整体居中不是每个元素居中,参考下面代码在浏览器显示效果)。

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
        .root {
            background-color: gray;
            height: 80px;
            width: 200px;
            display: table-cell;
            vertical-align: middle;
            font-size: 0px;
        }

        .left {
            float: left;
            height: 30px;
            width: 50px;
            background-color: red;
            position: relative;
            font-size: medium;
        }

        .left-text {
            width: 20px;
            height: 20px;
            background-color: pink;
            position: absolute;
            transform: translate(-50%, -50%);
            top: 50%;
            left: 50%;
            line-height: 20px;
            text-align: center;
        }

        .right {
            display: inline-block;
            height: 40px;
            width: 40px;
            line-height: 40px;
            text-align: center;
            background-color: green;
            font-size: medium;
        }

        </style>
    </head>

    <body>
        <div id="root" class="root">
            <div id="left" class="left">
                <div class="left-text">
                    a
                </div>
            </div>
            <div class="right">
                b
            </div>
        </div>
    </body>
</html>

2. Vue实例、ref的使用:一个组件就是一个Vue实例,一个应用由一个根Vue组成,每个Vue实例构建的时候接收一个配置参数,在Vue模板中ref可以引用到DOM元素或者Vue组件实例。

<template>
    <div>
        <!--  vue中通过this.$refs.left访问DOM元素 -->
        <div ref="left">

        </div>

        <!--  vue中通过this.$refs.right访问Vue实例,可以调用它的方法 -->
        <vue-button ref="right">

        </vue-button>

    </div>
</template>

3. v-on:使用要注意三个不同点,v-on:click里面的$event参数是DOM元素,v-on:eventName的自定义事件中$event参数是子组件触发事件传递过来的数据,记得v-on中没有this(暂时没去了解为什么)。

<template>
    <div class="root">
        <!-- 1:div单击的时候直接调用Vue实例的方法 -->
        <div v-on:click="clear"></div>

        <!-- 2:效果与1一样 -->
        <div v-on:click="clear($event)"></div>

        <!-- 3:$event是子组件传递的参数 -->
        <vue-select v-on:changeData="change($event)"></vue-select>

        <!-- 4:效果与3一样-->
        <vue-select v-on:changeData="change"></vue-select>
    </div>
</template>

methods: {
    clear(e){
        alert(e.target.innerText)
    },
    change(v){
         alert(v)
    }
}

4. JQuery是个老古董了,以后用到的机会不多:

(1) 了解一下$()返回的是JQuery对象,实际上他是个类数组(因为有length属性),通过eq(index)会创建一个新的jQuery对象表示该位置的元素进行操作,如果不通过eq()方法指定操作元素就是就是所有元素都进行操作。

(2) 看看一段官方对eq()的说明:Given a jQuery object that represents a set of DOM elements, the .eq() method constructs a new jQuery object from one element within that set.

【其他】

1. 接下来重点还是放回安卓上,在了解一个开源项目,里面包含了音视频相关的知识,要抽时间学习一下和总结技术。

2. 然后就是还要维护自己的类库和博客,最近才开始想要花时间去维护博客和Github,时间如何平衡这个还是要规划好。

3. 多学习Web前端基础,自然语言处理开始抓时间去了解基础,看看是否能接合原有已经理解的知识,例如正则表达式之类的。

【安卓周记】笔记复习记录:No.1的更多相关文章

  1. 【安卓周记】笔记复习记录:No.2

    [安卓] 1. Activity横竖屏切换生命周期变化,分三种情况: 1. 没有配置android:configChanges:每次横竖屏切换都会重新走一遍生命周期 2. 配置android:conf ...

  2. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  3. 安卓第六天笔记--ListView

    安卓第六天笔记--ListView 1.AdapteView AdapteView 继承ViewGroup它的本质是容器 AdapterView派生了3个子类: AbsListView AbsSpin ...

  4. 安卓开发笔记——丰富多彩的TextView

    随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...

  5. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  6. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  7. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  8. 安卓开发笔记——关于Handler的一些总结(上)

    接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...

  9. 安卓BindService笔记

    1 前言 最近学习到了安卓的service,记录一下自己对BindService的理解,学习教程以及部分代码来自菜鸟教程的android教程:菜鸟教程安卓端BindService链接 2 正文 先贴一 ...

随机推荐

  1. 使用 Vagrant + VirtualBox 快速构建 CentOS 下的 Docker 环境

    Vagrant - 基础概念: Vagrant 是什么? Vagrant是一款用于在单个工作流程中构建和管理虚拟机环境的工具.凭借易于使用的工作流程和专注于自动化,Vagrant降低了开发环境设置时间 ...

  2. 01 IO流(一)—— 流的概念、File类

    1 流的概念理解(重要) 理解流的概念非常重要. 流,就是程序到数据源或目的地的一个通道. 我们把这个通道实例化得到一个具体的流,相当于一个数据传输工具,它可以在程序与资源之间进行数据交换. 换言之, ...

  3. SPA项目首页导航+左侧菜单

    Mock.js是个啥 前后端分离之后,前端迫切需要一种机制,不再需要依赖后端接口开发,而今天的主角mockjs就可以做到这一点 Mock.js是一个模拟数据的生成器,用来帮助前端调试开发.进行前后端的 ...

  4. ELK基础配置

    前言 近期在研究日志系统的设计,感觉现在公司的子系统和接口太多了,日志看不过来,就想着有没有一种方法可以把各个程序的日志组合到一起.于是乎就搜到了ELK.开始对ELK的概念完全搞不懂,就照着各个平台文 ...

  5. slot 组件的内部传值 v-slot 的使用

    嵌套组件传值 person.vue <template> <div class="vslot-test"> <ul> <li v-for= ...

  6. Dijkstra+Heap模板

    普通Dijkstra: void DijkstraPath(int v0,int vis[],int dist[],int path[]) { int onePath[maxn]; int d; in ...

  7. log4net SmtpAppender 踩坑总结

    错误集合: System.Net.Mail.SmtpException: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first ! System.Net.Ma ...

  8. 【转载】 C#使用string.Join快速用特定字符串串联起数组

    在C#中有时候我们的数组元素需要通过一些特定的字符串串联起来,例如将整形Int数组通过逗号快速串联起来成为一个字符串,可以使用String.Join方法.或者一个字符串string类型数组所有元素快速 ...

  9. CSS3或CSS+JS实现改变滚动条样式(兼容所有浏览器)

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; /*滚动条宽度*/ height: 16px; /*滚动条高度*/ } ...

  10. 修改docker容器端口映射的方法

    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...