创建对象的过程 1: 首次创建类或者首次访问类的静态方法/静态域, 定位到该类的 .class 文件 2: 载入 .class 文件, 静态初始化的所有动作都会执行, 因此静态初始化只在 .class 对象首次加载时进行一次 3: new 对象, 首先在堆上分配足够的空间给对象 4: 这块存储空间会被清 0, 基本类型设为默认值, 引用设为 null 5: 执行字段定义处的初始化动作 6: 执行构造器 java 中创建和初始化是一体的, 创建的时候就已经有初始化操作, 即使想延后初始化(比如像在构造器里) 基本数据类型初始化时的默认值 boolean > false char > 0 byte & ...
View 构造方法中第三个参数 defStyleAttr
今天使用一个自定义控件继承自 AppCompatButton, 字体不是居中的, 最后排查发现是构造方法的问题; 对比 AppCompatButton 的源码发现是 defStyleAttr 参数的问题 public class TButton extends android.support.v7.widget.AppCompatButton { public TButton(Context context) { this(context, null); } public TButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TButton(Context context, AttributeSet attrs, in ...
java 基础回顾 – Object
Object 是 java 中的基类 里面的部分方法经常需要被重写, 所以必须对 Object 内的方法有所了解. 下面是 Object 的部分源码内容和注释 package java.lang; public class Object { public Object() { } /** * 拷贝对象, 直接调用是浅拷贝, 重写后通过对非基础类型的属性调用循环调用 clone() 方法实现深拷贝 */ protected java.lang.Object clone() throws CloneNotSupportedException { } /** ...
AIDL 回调中的 IllegalStateException
beginBroadcast java.lang.IllegalStateException 已知在 aidl 中回调注册的 callback 对象时, 需要使用 beginBroadcast() 和 finishBroadcast(), 且一个 begin 之后对应一个 finish; 下面是官方建议的回调的写法; int i = callbacks.beginBroadcast(); while (i > 0) { i--; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take c ...
在 Data Binding 使用数组资源和定义多个属性
同时定义多个属性 如果给一个 View 添加多个属性, 并且这几个属性是相互影响的, 可以像下面这样定义; @BindingAdapter({"background", "skin"}) public static void setViewBgStyle(Button view, String[] arrayId, int index) { } 1234 @BindingAdapter({"background", "skin"}) public static void setViewBgStyle(Button view, String[] arrayId, int index) { ...
ContentProvider
时间过得真快, 上一篇关于 ContentProvider 的笔记还是 2015 年的时候, 之后就没有用过 ContentProvider 了, 有些东西都忘了, 而且关于自定义 ContentProvider 和 greendao 的内容比较少, 这里再重新整理一遍; 这里使用 greendao 框架存储数据, 不同点就是 SQLiteDatabase 对象是通过 greendao 提供的 getWritableSQLiteDatabase 方法来获取到的; 正文 继承 ContentProvider, 来实现跨进程的数据库访问; 继承的子类需要在 AndroidManifest.xml 中进行配置; <provider android:exported="tr ...
andrid 8.1 前台服务
android 8.1 在设置前台服务时, 发送通知, 需要指定一个 channelId; private void startForeground() { String channelId =""; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { channelId=createNotificationChannel(); } Intent intent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity (this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); ...
恶意号码识别
自己用的原生系统的 android 手机没有恶意号码识别的功能,应用市场上的号码识别软件还需要通讯录这类的权限,用起来自己也不放心,于是就打算自己写一个应用来做这事; 搜索号码识别接口的时候, 在网上找到了这篇文章,但是原博主的文章里贴出的代码已经无法使用,就自己改了一下代码; 识别号码的原理 使用"360搜索"搜索号码 -> 分析返回的网页数据 -> 从网页数据中提取数据返回给客户端; 由于360搜索提供的格式可能会发生改变, 会造成接口无法使用, 下面贴出的源码也需要对应修改; 下图网页源码中的 格式 ...
GreenDao使用中遇到的异常
类型 Character 无法直接存储到数据库 Character 类型不是原始支持的类型, 转换为 String 类型存储到数据库; private String firstCharString = "~"; @Transient private Character firstChar = '~';//放弃存储 public void setFirstCharString(String firstCharString) { // 在 set String 时, 给 Character 赋值 if (firstCharString.length() > 0) { firstChar = firstCharString.charAt(0); } else { firstChar = ...
centOS FTP 安装配置
服务器为 VPS 1:卸载已装 vsftpd, 如果有 rpm -aq vsftpd 查看vsftpd版本(假设返回 “vsftpd-2.0.5-16.el55.1” ) rpm -e vsftpd-2.0.5-16.el55.1 删除该版本 2:安装 vsftpd yum install -y vsftpd 3:更改FTP配置文件 vi /etc/vsftpd/vsftpd.conf 将 vsftpd.conf 中 anonymousenable=YES 改为 anonymousenable=NO, 禁止匿名登录 4:给系统添加一个用户用于登陆 ftp 只可访问 /var/www/html/ 目录 useradd -d /var/www/html/ -s /sbin/nologin ftpuser 1 u ...