zm.blog

select * from learn


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

Weex 中使用Vue.js

发表于 2018-07-21 | 分类于 Android , Weex | | 阅读次数:
  • 只含有运行时的构建版本
  • 平台的差异
    • 执行环境
    • DOM
    • 样式
    • 事件
  • Web 渲染器
  • 单文件组件
    • 编译目标
    • 使用weex-loader
  • 支持的功能
    • 全局配置
    • 全局 API
    • 选项
    • 生命周期钩子
    • 实例属性
    • 实例方法
    • 模板指令
    • 特殊属性
    • 内置组件
阅读全文 »

Weex 和 Web 的平台差异

发表于 2018-07-20 | 分类于 Android , Weex | | 阅读次数:

Weex 是一个跨平台解决方案,Web 平台只是其一种运行环境,除此之外还可以在 Android 和 iOS 客户端中运行。原生开发平台和 Web 平台之间的差异,在功能和开发体验上都有一些差异。

Weex 环境中没有 DOM

DOM(Document Object Model),即文档对象模型,是 HTML 和 XML 文档的编程接口,是 Web 中的概念。Weex 的运行环境以原生应用为主,在 Android 和 iOS 环境中渲染出来的是原生的组件,不是 DOM Element。

不支持 DOM 操作

原生环境中不支持 Web API,没有 Element 、Event 、File 等对象,详细列表可以参考 Web APIs on MDN。不支持选中元素,如 document.getElementById 、 document.querySelector 等;当然也不支持基于 DOM API 的程序库(如 jQuery)。

阅读全文 »

Weex 集成到Android应用

发表于 2018-07-20 | 分类于 Android , Weex | | 阅读次数:

在执行以下步骤之前,请先确认您的Android开发环境是ok的。

JAVA环境, jdk7+

Android Studio

NDK r16、Cmake 3.9.0+ (可选项:如果需要编译WEEX源码,需要NDK环境支持)

1. 设置gradle依赖

1
2
3
4
5
6
7
8
9
10
11
dependencies {
...
// weex sdk and fastjson
compile 'com.taobao.android:weex_sdk:0.20.0.2@aar'
compile 'com.alibaba:fastjson:1.1.46.android'

//support library dependencies
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:appcompat-v7:23.1.1'
}
阅读全文 »

Weex 创建一个app

发表于 2018-07-20 | 分类于 Android , Weex | | 阅读次数:

以下步骤假设您已经了解了 Node.js 和 npm 的基本知识。如果对它们不熟悉,可以访问 https://docs.npmjs.com/ 来了解更多关于 npm 的用法。

Weex 提供了一个命令行工具 weex-toolkit 来帮助开发者使用 Weex。它可以用来快速创建一个空项目、初始化 iOS 和 Android 开发环境、调试、安装插件等操作。

目前 weex-toolkit 只支持创建 Vue.js 的项目。创建 Rax 的项目可以使用 rax-cli,参考 Rax 的官方网站 了解其用法。

初始化

请确保你已经安装了 Node.js,然后全局安装 weex-toolkit。

1
npm install weex-toolkit -g

这条命令会向你命令行环境中注册一个 weex 命令。你可以用 weex create 命令来创建一个空的模板项目:

1
weex create awesome-app

命令执行完以后,在当前目录的 awesome-app 文件夹里就有了一个空的 Weex + Vue.js 项目。

阅读全文 »

Weex 设置开发环境

发表于 2018-07-20 | 分类于 Android , Weex | | 阅读次数:

使用 Weex Online Editor 对 Weex 尝鲜是一个不错的选择,但如果你想更专业的开发 Weex,下面教你如何搭建本地开发环境进行 Weex 开发。

安装依赖

Weex 官方提供了weex-toolkit 的脚手架工具来辅助开发和调试。

首先,你需要 Node.js 和 Weex CLi。

安装 Node.js 方式多种多样,最简单的方式是在 Node.js 官网 下载可执行程序直接安装即可。

更多安装方式可参考 Node.js 官方信息

::: Tip

通常,安装了 Node.js 环境,npm 包管理工具也随之安装了。因此,直接使用 npm 来安装 weex-toolkit, 你也可以通过 yarn 来进行安装。

国内的开发者推荐将npm镜像切换至 Taobao NPM 镜像。

:::

运行下面的命令安装最新的beta版本工具:

1
2
$ npm install -g weex-toolkit@beta
$ weex -v // 查看当前weex工具版本

安装结束后你可以直接使用 weex help 命令验证是否安装成功,它会显示 weex 支持的所有指令,同时,你也可以通过 weex doctor 命令检查你的本地开发环境。

阅读全文 »

什么是 Weex ?

发表于 2018-07-20 | 分类于 Android , Weex | | 阅读次数:

Weex 是使用流行的 Web 开发体验来开发高性能原生应用的框架。
“Weex” 的发音是 /wiːks/, 和 “Weeks“ 同音。

Write Once, Run Everywhere

Weex 致力于使开发者能基于通用跨平台的 Web 开发语言和开发经验,来构建 Android、iOS 和 Web 应用。简单来说,在集成了 WeexSDK 之后,你可以使用 JavaScript 语言和前端开发经验来开发移动应用。

Weex 渲染引擎与 DSL 语法层是分开的,Weex 并不强依赖任何特定的前端框架。目前 Vue.js 和 Rax 这两个前端框架被广泛应用于 Weex 页面开发,同时 Weex 也对这两个前端框架提供了最完善的支持。Weex 的另一个主要目标是跟进流行的 Web 开发技术并将其和原生开发的技术结合,实现开发效率和运行性能的高度统一。在开发阶段,一个 Weex 页面就像开发普通网页一样;在运行时,Weex 页面又充分利用了各种操作系统的原生组件和能力。

阅读全文 »

通讯录获取/添加信息 AddressBook

发表于 2018-07-19 | 分类于 Android , 代码片段 | | 阅读次数:

源码:AddressBook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package com.example.zm.addressbook;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ContactUtil {

/**
* 获取联系人信息,并把数据转换成json数据
*
* @return
* @throws JSONException
*/
public static String getContactInfo(Context context) throws JSONException {
JSONObject contactData = null;
JSONObject jsonObject = null;
JSONArray jsonArray = null;
JSONObject jsonObject2 = null;
JSONArray jsonArray2 = null;

contactData = new JSONObject();
jsonArray = new JSONArray();
String mimetype = "";
int oldrid = -1;
int contactId = -1;
// 1.查询通讯录所有联系人信息,通过id排序,我们看下android联系人的表就知道,所有的联系人的数据是由RAW_CONTACT_ID来索引开的
// 所以,先获取所有的人的RAW_CONTACT_ID
Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, null, null, ContactsContract.Data.RAW_CONTACT_ID);
contactData.put("userId", "11111");
while (cursor.moveToNext()) {
contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
if (oldrid != contactId) {
jsonObject = new JSONObject();
jsonArray2 = new JSONArray();
jsonArray.put(jsonObject);
oldrid = contactId;
}
mimetype = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)); // 取得mimetype类型,扩展的数据都在这个类型里面

Bitmap headPhoto = getHighPhoto(contactId + "", context.getContentResolver());
if (null == headPhoto) {
jsonObject.put("headImageUrl", "");
} else {
jsonObject.put("headImageUrl", headPhoto);
}
// 名字
if (ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE.equals(mimetype)) {
cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
String firstName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String lastname = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String trueName = firstName + lastname;
if (TextUtils.isEmpty(trueName)) {
jsonObject.put("trueName", "");
} else {
jsonObject.put("trueName", trueName);
}
}
// 昵称
if (ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE.equals(mimetype)) {
cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.DISPLAY_NAME));
String nickName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));
if (TextUtils.isEmpty(nickName)) {
jsonObject.put("nickName", "");
} else {
jsonObject.put("nickName", nickName);
}
}
List<AddressBookMoudle.ContactBook> contactList = new ArrayList<AddressBookMoudle.ContactBook>();
// 1.2 获取各种电话信息
if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(mimetype)) {
int phoneType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); // 手机
// 个人电话
if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) {
String mobile = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
AddressBookMoudle.ContactBook contactBook = new AddressBookMoudle.ContactBook();
contactBook.setContact(mobile);
contactBook.setContactType("0");
contactList.add(contactBook);
}
}
// Email
if (ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE.equals(mimetype)) {
String mobileEmail = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
AddressBookMoudle.ContactBook contactBook = new AddressBookMoudle.ContactBook();
contactBook.setContact(mobileEmail);
contactBook.setContactType("1");
contactList.add(contactBook);
}

if (contactList.size() > 0) {
for (int i = 0; i < contactList.size(); i++) {
jsonObject2 = new JSONObject();
jsonObject2.put("contact", contactList.get(i).getContact());
jsonObject2.put("contactType", contactList.get(i).getContactType());
jsonArray2.put(jsonObject2);
}
jsonObject.put("contactList", jsonArray2);

}

// 查找event地址
if (ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE.equals(mimetype)) { // 取出时间类型
int eventType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE));
// 生日
if (eventType == ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) {
String birthday = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));
if (TextUtils.isEmpty(birthday)) {
jsonObject.put("birthDay", "");
} else {
jsonObject.put("birthDay", birthday);
}
}
}

// 获取组织信息
if (ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE.equals(mimetype)) { // 取出组织类型
int orgType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TYPE)); // 单位
if (orgType == ContactsContract.CommonDataKinds.Organization.TYPE_CUSTOM) { // if (orgType ==
// Organization.TYPE_WORK)
// {
String company = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY));
if (TextUtils.isEmpty(company)) {
jsonObject.put("company", "");
} else {
jsonObject.put("company", company);
}
String jobTitle = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
if (TextUtils.isEmpty(jobTitle)) {
jsonObject.put("jobtitle", "");
} else {
jsonObject.put("jobtitle", jobTitle);
}
String department = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT));
if (TextUtils.isEmpty(department)) {
jsonObject.put("department", "");
} else {
jsonObject.put("department", department);
}
}
}
}

cursor.close();
contactData.put("addressBookList", jsonArray);
Log.i("contactData", contactData.toString());
return contactData.toString();
}


/**
* 获取联系人高清头像
*
* @param people_id 联系人ID
* @param cr 调用容器
* @return 联系人的高清头像
*/
public static Bitmap getHighPhoto(String people_id, ContentResolver cr) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(people_id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri, true);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"userId": "11111",
"addressBookList": [{
"headImageUrl": "",
"trueName": "张三",
"company": "北京xxx有限公司",
"jobtitle": "研发工程师",
"department": "",
"contactList": [{
"contact": "185 0000 1234",
"contactType": "0"
}, {
"contact": "zhangsan@163.com",
"contactType": "1"
}],
"birthDay": "2018-03-25"
}]
}
阅读全文 »

Mac_VSCode快捷键

发表于 2018-07-19 | 分类于 快捷键 | | 阅读次数:

官方快捷键

全局

快捷键 描述
Command + Shift + P / F1 显示命令面板
Command + P 快速打开
Command + Shift + N 打开新窗口
Command + W 关闭窗口
阅读全文 »

Android ANR问题总结

发表于 2018-07-19 | 分类于 Android , Android Tips | | 阅读次数:

在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子。
一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到,而这些ANR问题有很大一部分是因为我们的代码不合理导致,这就需要我们定位问题,修复问题,并且在以后的代码设计中尽量避免这些不合理。
最近工作中集中分析了项目的大量的用户自动上报的ANR问题日志,虽然网上ANR相关的文章已经很多了,在这里还是做一个总结。

提纲

一. 什么情况下会出现ANR
二. ANR机制的原理
三. 如何分析ANR问题
四. 如何避免ANR问题

阅读全文 »

Android_SDK版本号与APILevel的对应关系

发表于 2018-07-18 | 分类于 Android , Android Tips | | 阅读次数:

一、Android各版本对应的SDK版本

平台版本 API VERSION_CODE 备注
Android 9.0 28 Android P Preview(9.0) 平台亮点
Android 8.1 27 Oreo(8.1) 平台亮点
Android 8.0 26 Oreo(8.0) 平台亮点
Android 7.1 25 Nougat(牛轧糖) 平台亮点
Android 7.0 24 N(牛轧糖) 平台亮点
Android 6.0 23 M(棉花糖) 平台亮点
Android 5.1 22 LOLLIPOP_MR1(棒棒糖) 平台亮点
Android 5.0 21 LOLLIPOP (棒棒糖)
Android 4.4W 20 KITKAT_WATCH(奇巧巧克力) 仅限 KitKat for Wearables
Android 4.4 19 KITKAT (奇巧巧克力) 平台亮点
Android 4.3 18 JELLY_BEAN_MR2(果冻豆) 平台亮点
Android 4.2、4.2.2 17 JELLY_BEAN_MR1(果冻豆) 平台亮点
Android 4.1、4.1.1 16 JELLY_BEAN (果冻豆) 平台亮点
Android 4.0.3、4.0.4 15 ICE_CREAM_SANDWICH_MR1(冰激凌三明治) 平台亮点
Android 4.0、4.0.1、4.0.2 14 ICE_CREAM_SANDWICH(冰激凌三明治)
Android 3.2 13 HONEYCOMB_MR2 (蜂巢)
Android 3.1.x 12 HONEYCOMB_MR1(蜂巢) 平台亮点
Android 3.0.x 11 HONEYCOMB (蜂巢) 平台亮点
Android 2.3.4 Android 2.3.3 10 GINGERBREAD_MR1(姜饼) 平台亮点
Android 2.3.2 Android 2.3.1 Android 2.3 9 GINGERBREAD(姜饼)
Android 2.2.x 8 FROYO(冻酸奶) 平台亮点
Android 2.1.x 7 ECLAIR_MR1 (埃克拉) 平台亮点
Android 2.0.1 6 ECLAIR_0_1(埃克拉)
Android 2.0 5 ECLAIR(埃克拉)
Android 1.6 4 DONUT(甜甜圈) 平台亮点
Android 1.5 3 CUPCAKE(纸杯蛋糕) 平台亮点
Android 1.1 2 BASE_1_1
Android 1.0 1 BASE

二、Android各版本的市场占有率和对应JDK版本

Version Codename API Distribution
2.3.3 - 2.3.7 Gingerbread 10 0.3%
4.0.3 - 4.0.4 Ice Cream Sandwich 15 0.4%
4.1.x Jelly Bean 16 1.5%
4.2.x Jelly Bean 17 2.2%
4.3 Jelly Bean 18 0.6%
4.4 KitKat 19 10.3%
5.0 Lollipop 21 4.8%
5.1 Lollipop 22 17.6%
6.0 Marshmallow 23 25.5%
7.0 Nougat 24 22.9%
7.1 Nougat 25 8.2%
8.0 Oreo 26 4.9%
8.1 Oreo 27 0.8%
阅读全文 »
1…363738
ZhangMiao

ZhangMiao

Android/Flutter Developer

379 日志
58 分类
143 标签
RSS
E-Mail QQ Github StackOverflow
友情链接
  • Kaisir
  • Liujianhui
  • Leo
  • Hongyang
  • Liuwangshu
  • Jspang
  • Blankj
  • WuXiaoLong
  • Molunerfinn
  • Ofind
  • Gcssloop
© 2024 ZhangMiao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
本站访客数 人次 本站总访问量 次