安卓property_service代码移植供app开发使用(上)
1.移植目标
1)移植混合二叉树算法
2)移植后可将property键值对改为普通的key–value。
安卓系统的key默认是以.
分割的,其实我也建议大家移植后的key也具有某种分隔符,或者具有某种树形结构关系。否则,移植该算法也没啥用处。
- 可支持多进程。
安卓系统的property_service,支持多进程设置-获取属性,只不过属性最终是通过socket的方式传给init进程进行设置的。其实我们从context上下文通过open函数以只读模式打开属性文件的时候,就可以知道其他进程对文件没有写权限。
源码已提交至(https://github.com/whulzz1993/AndroidDemo/tree/master/KVModule)
2.将上下文放入到assets中
“^”为分隔符, com表示前缀。com_prefix会被创建为上下文文件。
#assets/kv
com^com_prefix
*^other
进程启动后你将会在私有存储中找到com_prefix文件, 该文件或存储相关key-value信息
angler:/data/data/com.example.demo/files/kv # cat init.kv
com^com_prefix
*^otherangler:/data/data/com.example.demo/files/kv #
angler:/data/data/com.example.demo/files/kv #
angler:/data/data/com.example.demo/files/kv #
angler:/data/data/com.example.demo/files/kv # cat data/com_prefix
H? PROP0001comangler:/data/data/com.example.demo/files/kv #
angler:/data/data/com.example.demo/files/kv #
3.先看看我的KVModule使用例子
3.1初始化KVModule
在application中尽量早的初始化KV
public class DemoApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
@Override
public void onCreate() {
super.onCreate();
KVUtils.init(this);
}
}
3.2KVModule异步初始化,不阻塞main线程
private void initKv(@NonNull Context context) {
mAppContext = context;
asyncLoadKv();
}
private void asyncLoadKv() {
new Thread(new Runnable() {
@Override
public void run() {
try {
ensureKvDir();
System.loadLibrary("modulekv");
String dataDir = mAppContext.getApplicationInfo().dataDir;
tryExtractFromAsset("kv", dataDir, "files/kv/init.kv");
NKVI(dataDir, true);
mReady.open();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "KVinit").start();
}
3.3使用单测case验证
public class KVTest {
private static final String TAG = "KVTest";
private static final String[][] pairs = {
{"1", "test1"},
{"3", "test3"},
{"5", "test5"}
};
public static void test() {
for (int i = 0; i < pairs.length; i++) {
KVUtils.put(pairs[i][0], pairs[i][1]);
}
for (int i = 0; i < pairs.length; i++) {
if (!TextUtils.equals(KVUtils.getValue(pairs[i][0]), pairs[i][1])) {
Log.e(TAG, String.format("test failed for %s (%s vs %s)",
pairs[i][0], pairs[i][1], KVUtils.getValue(pairs[i][0])));
} else {
Log.d(TAG, String.format("test success for %s %s",
pairs[i][0], KVUtils.getValue(pairs[i][0])));
}
}
}
}
log输出:
03-31 20:53:53.782 20049 20049 D KVTest : test success for 1 test1
03-31 20:53:53.782 20049 20049 D KVTest : test success for 3 test3
03-31 20:53:53.782 20049 20049 D KVTest : test success for 5 test5
全部通过,大吉大利!
在此基础上,可以进行扩展,实现自己的需求。
比如替代sharedpref、简易的数据库