<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chenyingjie_Android的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/chenyingjie_Android</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chenyingjie_Android]]></copyright><item><title><![CDATA[（三）区块链钱包之加密算法简介]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/117085233</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/117085233</guid><author>chenyingjie_Android</author><pubDate>Thu, 20 May 2021 18:45:57 +0800</pubDate><description><![CDATA[钱包作为用户隐私数据不可以对其进行直接保存，更不可以上传服务器，所以如何处理来管理钱包需要慎重。]]></description><category></category></item><item><title><![CDATA[（一）区块链钱包之生成助记词]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/117077778</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/117077778</guid><author>chenyingjie_Android</author><pubDate>Thu, 20 May 2021 15:59:31 +0800</pubDate><description><![CDATA[助记词

明文私钥的另一种表现形式，最早是由 BIP39 提案提出，其目的是为了帮助用户记忆复杂的私钥 ( 64 位的哈希值)。助记词一般由12、15、18、21个单词构成，这些单词都取自一个固定词库（2048个），其生成顺序也是按照一定算法而来，所以用户没必要担心随便输入 12 个单词就会生成一个地址。

生成过程

生成一个128位随机数，再加上对随机数做的校验4位，得到132位的一个数，然后按每11位做切分，这样就有了12个二进制数，然后用每个数去查BIP39定义的单词表，这样就得到12个助记词（当.]]></description><category></category></item><item><title><![CDATA[从源码分析Handler机制]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110443537</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110443537</guid><author>chenyingjie_Android</author><pubDate>Wed, 02 Dec 2020 16:39:02 +0800</pubDate><description><![CDATA[一、发送消息
当发送一个消息，在handler里面最后会执行方法：
    private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
            long uptimeMillis) {
        msg.target = this;
        msg.workSourceUid = ThreadLocalWorkSource.getUid();

        if (mAs]]></description><category></category></item><item><title><![CDATA[反编译apk文件，查找jar文件中字符串]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110483638</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110483638</guid><author>chenyingjie_Android</author><pubDate>Wed, 02 Dec 2020 15:45:10 +0800</pubDate><description><![CDATA[package com.lzxx.testdemo.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipF]]></description><category></category></item><item><title><![CDATA[IPC通信方式]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110220758</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/110220758</guid><author>chenyingjie_Android</author><pubDate>Tue, 01 Dec 2020 18:10:44 +0800</pubDate><description><![CDATA[aidl是IPC机制的一种解决方案，使用起来相对Messenger等稍微复杂，简单例子如下：
1、服务端
首先创建服务端的应用，app/src/main下创建aidl文件，这里只定义了一个方法，传进来一个字符串，经过服务端处理在返回给客户端：

package com.lianzhuoxinxi.baoduoduo;

import com.lianzhuoxinxi.baoduoduo.User;

interface IMyAidlInterface {

    String getName(Stri]]></description><category></category></item><item><title><![CDATA[Mac中git忽略DS_Store文件]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109605325</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109605325</guid><author>chenyingjie_Android</author><pubDate>Tue, 10 Nov 2020 19:26:00 +0800</pubDate><description><![CDATA[1、命令行执行
vi ~/.gitignore_global

2、在打开文件中写入
.DS_Store
.DS_Store?
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

3、保存后再次执行
git config --global core.excludesfile ~/.gitignore_global


]]></description><category></category></item><item><title><![CDATA[RSA加解密及分段加解密]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109577680</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109577680</guid><author>chenyingjie_Android</author><pubDate>Mon, 09 Nov 2020 14:57:00 +0800</pubDate><description><![CDATA[package com.xxx;

import android.util.Base64;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.In]]></description><category></category></item><item><title><![CDATA[创建线程的方式以及Executors的四种线程池]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109512287</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109512287</guid><author>chenyingjie_Android</author><pubDate>Thu, 05 Nov 2020 16:13:17 +0800</pubDate><description><![CDATA[创建线程有几种方式？
面试常问的问题，一般回答3种方式，及格；如果你能具体的说4种，那你就满分了，第四种是通过Executors创建线程池。
先来说说创建线程的3种方式：
一、继承Thread类
public class ExtendsThread extends Thread {

    @Override
    public void run() {
        super.run();
        Log.e("ExtendsThread &gt;&gt;&gt; ", "thread r]]></description><category></category></item><item><title><![CDATA[Java和go加密，解密，Base64失败]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109490471</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109490471</guid><author>chenyingjie_Android</author><pubDate>Wed, 04 Nov 2020 15:27:05 +0800</pubDate><description><![CDATA[在客户端和go后台对接口的时候，加解密出现了问题记录。
问题主要出现在base64上，刚开始Android使用
import android.util.Base64;

public class AesUtil {

	public static String encryptEcb(String content, String key) {
		if (TextUtils.isEmpty(content) || TextUtils.isEmpty(key)) return "";
        try {]]></description><category></category></item><item><title><![CDATA[Android实时监测网络连接状态及网络是否可用，类似微信的功能。]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109313634</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/109313634</guid><author>chenyingjie_Android</author><pubDate>Tue, 27 Oct 2020 17:10:06 +0800</pubDate><description><![CDATA[实现实时监控网络变化，类似于微信的功能，当网络不可用时app能实时感知到，网上找了很多例子并不能实现，或者只实现其中一部分功能，我就参考大家的方法做一个组合。
一、网络状态变化监测，此方式只能监测网络连接改变，不能判断是否可用(例如网络连接正常，但是不能访问网络)。
在使用时定义一个方法，名字随便，参数必须是一个NetWorkState类型：
// 监听网络变化类型
    @NetWorkMonitor(monitorFilter = {NetWorkState.WIFI, NetWorkState.GP]]></description><category></category></item><item><title><![CDATA[关于Android Q 的文件分区存储权限适配研究]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108254545</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108254545</guid><author>chenyingjie_Android</author><pubDate>Thu, 27 Aug 2020 11:54:42 +0800</pubDate><description><![CDATA[我们发现每安装一个应用，你的手机文件管理中就会创建很多文件夹，而且应用卸载文件夹还在，里面的文件也在，手机用着用着文件系统越来越庞大，最后就是卡顿。
在Android 10 新特性中有一个保护外部存储设备中的用户数据，应用可以将自己的文件存储在专用沙盒中，另外就是可以访问公共文件夹，比如Download、DCIM、Music等，这样就不会在/storage/emulated/0/下面创建很多文件夹，你也不能随便访问别的应用文件夹。

Android 10
虽然加入了此特性，但是Google肯定会考虑给开发者]]></description><category></category></item><item><title><![CDATA[Android关于设备唯一标识符的获取，适配Android10]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108243235</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108243235</guid><author>chenyingjie_Android</author><pubDate>Wed, 26 Aug 2020 18:18:09 +0800</pubDate><description><![CDATA[在开发中我们需要获取一些设备信息，比如设备宽高、分辨率、IMEI、MAC地址等，有一些设备信息是不会变化的，有一些会随着系统的升级改变，而且还会受权限的影响。
在实际开发中也踩过不少坑，经过测试、研究得出一些结论，希望能帮助到大家，同时也作为一个学习记录。]]></description><category></category></item><item><title><![CDATA[Android获取网络类型--最新最全版]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108205009</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108205009</guid><author>chenyingjie_Android</author><pubDate>Tue, 25 Aug 2020 09:07:17 +0800</pubDate><description><![CDATA[public static String getNetworkState(Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取网络服务
        if (null == connManager) { // 为空则认为无网络
            return NETW]]></description><category></category></item><item><title><![CDATA[关于集合去重的学习总结]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108140863</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/108140863</guid><author>chenyingjie_Android</author><pubDate>Sat, 22 Aug 2020 09:39:08 +0800</pubDate><description><![CDATA[以List为例：
List&lt;String&gt; list = new ArrayList&lt;&gt;();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("a");
list.add("b");
list.add("c");

1、最容易想到的就是两层for循环
for(int i = 0; i &lt; list.size(); i++) {
	for(int j = 0;]]></description><category></category></item><item><title><![CDATA[SQL语句]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/107160324</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/107160324</guid><author>chenyingjie_Android</author><pubDate>Mon, 06 Jul 2020 15:37:42 +0800</pubDate><description><![CDATA[1、说明：创建数据库
CREATE DATABASE database-name
2、说明：删除数据库
drop database dbname
3、说明：备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明：创建新表
create t]]></description><category></category></item><item><title><![CDATA[RecyclerView的Item复用导致动画不执行问题]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106875309</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106875309</guid><author>chenyingjie_Android</author><pubDate>Sat, 20 Jun 2020 18:16:09 +0800</pubDate><description><![CDATA[场景：在RecyclerView的item中的某个控件在状态0时执行动画，其他状态下不执行。
实现方式：判断状态0时给view设置动画，我采用补间动画。
问题：在滑动的时候，划到下面再滑倒上面，上面刚才执行的动画不动了，这是由于itemView在离开屏幕的时候，view自身会把它的动画置空。
那么我们就可以考虑在view依附在窗口的时候执行动画：
            if (holder.timerView.getTag() instanceof View.OnAttachStateChangeList]]></description><category></category></item><item><title><![CDATA[日期Date操作的优化]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106768805</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106768805</guid><author>chenyingjie_Android</author><pubDate>Mon, 15 Jun 2020 18:28:20 +0800</pubDate><description><![CDATA[一般我们对日期的操作使用的类有Date、DateTimeFormat、Calendar，在进行日期格式操作时一般用DateTimeFormat比较多，我们知道Date出来的数据格式是
Mon Jun 15 11:00:59 CST 2020

我们想把它转换成易读的格式，使用DateTimeFormat：
public void test() {
    Date date = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat]]></description><category></category></item><item><title><![CDATA[ThreadLocal分析和使用]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106768250</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106768250</guid><author>chenyingjie_Android</author><pubDate>Mon, 15 Jun 2020 18:12:43 +0800</pubDate><description><![CDATA[ThreadLocal是一个多线程情况下为独立线程存储数据的类。
这样说可能不太好理解，下面通过一个例子来看清晰明了：
private ThreadLocal&lt;Integer&gt; local = new ThreadLocal&lt;&gt;();
private int i;


@RequiresApi(api = Build.VERSION_CODES.N)
private void threadLocal() {
    IntStream.range(0, 5).forEach(valu]]></description><category></category></item><item><title><![CDATA[RecyclerView和ListView区别]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106574226</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106574226</guid><author>chenyingjie_Android</author><pubDate>Fri, 05 Jun 2020 17:01:43 +0800</pubDate><description><![CDATA[RecyclerView：
1、规范了ViewHolder，内部实现了缓存机制；
2、实现多种效果，横向/纵向，线性/网格/瀑布流；
3、不能设置EmptyView；
4、不能设置HeaderView和FooterView；
5、可以局部刷新
6、自带动画，可以自定义，继承ItemAnimator；
7、没有item事件，需要自己定义；
8、实现了NestedScrollingChild，可以实现嵌套滚动，例如配合CollapsingToolbarLayout使用；
ListView：
1、需要自定义Vie]]></description><category></category></item><item><title><![CDATA[Socket.IO实现聊天功能]]></title><link>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106554850</link><guid>https://blog.youkuaiyun.com/chenyingjie_Android/article/details/106554850</guid><author>chenyingjie_Android</author><pubDate>Thu, 04 Jun 2020 18:06:37 +0800</pubDate><description><![CDATA[我们知道OkHttp3中有WebSocket可以实现聊天功能，但是我们需要自己定义前后台交互协议，比较麻烦，而Socket.IO完美的帮我们定义好了这个协议，用起来相当简单。
Soket.IO文档在Github上都有
1、为连接做准备，一般在代码块中。
这里options可以设置一些其他参数，比如重连(默认true)，重连次数等。
	{
        try {
            IO.Options options = new IO.Options();
            options.t]]></description><category></category></item></channel></rss>