Skip to content

Commit

Permalink
1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
yizeliang committed Dec 23, 2022
1 parent 0139eb2 commit 4505da4
Show file tree
Hide file tree
Showing 51 changed files with 995 additions and 635 deletions.
73 changes: 50 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,43 @@

还在为项目中 大量的 未保存和恢复处理的变量 引起的错误 头疼?

**如果你是使用的ViewModel,请使用SavedHandler 实现自动保存和恢复,官方实现的很好**
**说明**

1. 本项目适用于非`ViewModel`项目的纯`Kotlin`项目或者`Kotlin``Java`混编项目
2. 本项目适用于`Activity``Fragment`的保存和恢复, 仅支持`androidx`
3.`Java`项目推荐[PrototypeZ/SaveState](https://github.com/PrototypeZ/SaveState)这个库,
其实如果你不在意引入了`kotlin`的依赖, 那么使用本库也没有问题
4. 如果你是使用的ViewModel,请使用SavedHandler 实现自动保存和恢复,官方实现的就挺好的了,
当然也可以使用这个库加强一下[line/lich/savedstate](https://github.com/line/lich/tree/master/savedstate)
5. 目前仅支持`kotlin` `1.6.21-1.0.6`

## 使用方法

- gradle配置

```gradle
// root/build.gradle 添加ksp
classpath "com.google.devtools.ksp:symbol-processing-gradle-plugin:1.6.21-1.0.6"
// 项目build.gradle 添加ksp
apply plugin: 'com.google.devtools.ksp'
// dependencies 添加依赖
implementation 'cn.yzl.auto.save:core:1.0.0'
ksp 'cn.yzl.auto.save:ksp:1.0.0'
```

- kotlin
```kotlin

```kotlin
// 在类上加上注解:@AutoSaveRestore
//使用 delegate
var a: Int? by SavedDelegates.nullable { 10 }

var b: IntArray by SavedDelegates.notNull {
IntArray(10) { it }
}

//在Activity 合适的方法中(onCreate?,onResume?, 总之在 页面关闭之前调用即可)
SavedDelegateHelper.registerSimple(activity)
//
SavedDelegateHelper.registerSimple(fragment)

//
SavedDelegateHelper.registerSavedProvider(savedStateRegistry, activity / fragment)
//
SavedDelegateHelper.registerWithLifecycle(lifecycleOwner, savedStateRegistry, activity / fragment)
// 然后就没了, 非常简单,而且加注解是为了类型的安全检查,用来检查非Bundle支持的类型防止引起闪退
```

-java
Expand All @@ -42,42 +56,55 @@ private int a=0;
@AutoSaveRestore
private String b=0;

//在Activity.onCreate方法中
//在Activity.onCreate/Fragment.createView方法中,
// 如果你有base类,建议加在super.onCreate之前
// 如果你的base类有添加这行代码, 那么子类就不需要添加了. 都添加也没关系,不会重复执行属性恢复
SavedDelegateHelper.registerForJava()
```

然后,你的这些变量,在页面被销毁时,就会被自动恢复了!!
然后,你的这些变量,在页面被销毁重建时,就会被自动恢复了!!

## 效果

打开手机 开发者模式中的 不保留活动

![screen](./screen/screen.gif)

## 实现说明

## 项目依赖

- androidx 和kotlin ,所以一定要是 kotlin 开发的项目,并且迁移了androidx库
- 真正保存和恢复数据的是savestate库,这个库在 androidx 中默认被导入,所以可以直接使用
- `kotlin` 没有使用到反射, `Java` 如果是`protect` 以及 `private` 的变量,则需要使用反射, `Java`反射的性能还好(`kotlin`反射效率就太差了),
建议使用 默认修饰符(包可见)
- `ksp` 的目的有两个, 1 检验`kotlin`代码的类型安全,2 生成`java`代码的辅助代码,并做安全检查
- 其实`kotlin`类上可以不加注解`AutoSaveRestore`, 但是加上注解,可以检查类型安全,防止引起闪退,所以还是建议加上注解

## TODO

- 没有测试效率问题,因为保存数据采用了反射
- 保存数据时会检查数据是否能够写入Bundle,主要是类型判断,这样存在隐患,需要触发了才能报错,想办法提前,检验
- 还没有进行比较全面的测试,主要是数据类型方面
- [ ] 支持`kotlin` `1.7.0`
- [ ] 考虑是否实现整个类的自动保存和恢复, 但是这样会导致类的变量被保存, 有些变量可能不需要保存,另外就是不支持Bundle写入的变量怎么办没想好
- [ ] kotlin compiler插件实现kotlin的属性保存和恢复, 这样就可以避免使用反射, 一个注解搞定,也就不用加 Delegate了

## 其他说明

- 关于`Kotlin`代码入侵高的问题,暂时没有想好怎么解决, `AGP4``AGP7.0`之间变化太大,属实没空研究这块,所以选择使用ksp实现,否则 `Gradle Plugin`
可能是最佳选择

## 更新日志

### 1.0.0

- 大量重构
- 完成ksp自动生成代码,支持Java代码
- 移除 kotlin 反射
- 支持kotlin 1.6.21-1.0.6
- 主要类变化: cn.yzl.saved.delegate.SavedDelegates -> cn.yzl.auto.save.AutoSaveDelegates

### 0.0.5

- 提供统一代理方法类`SavedDelegates`
- 优化代理从 `SavedRegister`中获取bundle后的操作,只读取一次,以前是每次都读取
- 提供`SavedDelegates.lateInit` 代理,替换`latainit bar`


### 0.0.1
### 0.0.1

项目初步完成,还没有进行比较全面的测试(数据类型方面)

Expand Down
15 changes: 8 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.devtools.ksp'

android {
compileSdkVersion 29
compileSdkVersion 33
buildToolsVersion "29.0.3"

defaultConfig {
applicationId "cn.yzl.saved.delegate.simple"
minSdkVersion 21
targetSdkVersion 29
applicationId "cn.yzl.auto.save.simple"
minSdkVersion 23
targetSdkVersion 33
versionCode 1
versionName "1.0"

Expand All @@ -30,9 +30,10 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation project(path: ':savedelegate')
implementation project(path: ':core')
ksp project(':ksp')
implementation project(":testlib")
}
22 changes: 18 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.yizems.saved.delegate.simple">
package="cn.yzl.auto.save.simple">

<application
android:name="cn.yzl.auto.save.simple.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="cn.yizems.saved.delegate.simple.Main2Activity"></activity>
<activity android:name="cn.yizems.saved.delegate.simple.MainActivity">
<activity
android:name="cn.yzl.auto.save.simple.LastPageActivity"
android:label="最后一个页面"
android:exported="false"></activity>
<activity
android:name="cn.yzl.auto.save.simple.TestKotinActivity"
android:label="测试Kotlin"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="cn.yizems.saved.delegate.simple.MainActivity3" />
<activity
android:name="cn.yzl.auto.save.simple.TestJava"
android:label="测试Java"
android:exported="false" />
<activity
android:name="cn.yzl.auto.save.simple.TestJavaExtendLibrary"
android:label="测试Java继承自lib"
android:exported="false" />
</application>

</manifest>

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package cn.yizems.saved.delegate.simple
package cn.yzl.auto.save.simple

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class Main2Activity : AppCompatActivity() {
/**
* 最后一个页面
*/
class LastPageActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
13 changes: 13 additions & 0 deletions app/src/main/java/cn/yzl/auto/save/simple/MyApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cn.yzl.auto.save.simple

import android.app.Application

class MyApplication : Application() {

override fun onCreate() {
super.onCreate()
Thread.setDefaultUncaughtExceptionHandler { t, e ->
e.printStackTrace()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cn.yizems.saved.delegate.simple;
package cn.yzl.auto.save.simple;

import android.content.Context;
import android.content.Intent;
Expand All @@ -8,40 +8,53 @@

import androidx.appcompat.app.AppCompatActivity;

import cn.yizems.auto.save.SavedDelegateHelper;
import cn.yizems.auto.save.base.AutoSaveRestore;
import java.util.ArrayList;

public class MainActivity3 extends AppCompatActivity {
import cn.yzl.auto.save.AutoSaveHelper;
import cn.yzl.auto.save.base.AutoSaveRestore;

/**
* 测试java类的自动保存
*/
public class TestJava extends AppCompatActivity {

@AutoSaveRestore
private int a = 10;
@AutoSaveRestore("bbbb")
@AutoSaveRestore
private String b = "hahah";
@AutoSaveRestore
private boolean c = false;
@AutoSaveRestore
private int[] d = new int[]{1, 2, 3};
int[] d = new int[]{1, 2, 3};
@AutoSaveRestore
PDemo pDemo;
@AutoSaveRestore
private PDemo pDemo;
Sdemo sDemo;

@AutoSaveRestore
private Sdemo sDemo;
ArrayList<PDemo> pDemos = new ArrayList<>();

@AutoSaveRestore
PDemo pDemo2;

@Override
protected void onCreate(Bundle savedInstanceState) {
log("onCreate:" + this.hashCode());

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
final long startTime = System.currentTimeMillis();
SavedDelegateHelper.registerForJava(this);
AutoSaveHelper.registerForJava(this);
log("--registerForJava--" + (System.currentTimeMillis() - startTime));

log("----");
log(String.valueOf(a));
log(String.valueOf(b));
log(String.valueOf(c));
log(b.length() + "");
log(pDemo.toString());
if (pDemo != null) {
log(pDemo.toString());
}
if (sDemo != null) {
log(sDemo.toString());
}
Expand All @@ -56,19 +69,26 @@ public void onClick(View v) {
d = new int[]{1, 2, 3, 4};
pDemo = new PDemo("pDemo2", false);
sDemo = new Sdemo("sDemo2", 15);
startActivity(new Intent(MainActivity3.this, Main2Activity.class));
startActivity(new Intent(TestJava.this, TestJavaExtendLibrary.class));
}
});

}


@Override
protected void onDestroy() {
log("onDestroy:" + this.hashCode());
super.onDestroy();
}

private void log(String msg) {
Log.e("MainActivity3", msg);
Log.e("TestJava", msg);
}


public static void start(Context context) {
context.startActivity(new Intent(context, MainActivity3.class)
context.startActivity(new Intent(context, TestJava.class)
.putExtra("pDemo", new PDemo("7777", true))
.putExtra("c", true)
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package cn.yzl.auto.save.simple;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import cn.yzl.auto.save.AutoSaveHelper;
import cn.yzl.auto.save.base.AutoSaveRestore;
import cn.yzl.auto.save.testlib.TestActivity;

/**
* 测试java类的自动保存,该类继承自一个library中的类
*/
public class TestJavaExtendLibrary extends TestActivity {

@AutoSaveRestore
private int b = 10;

@Override
protected void onCreate(Bundle savedInstanceState) {
log("onCreate:" + this.hashCode());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
final long startTime = System.currentTimeMillis();
AutoSaveHelper.registerForJava(this);
a++;
b++;
log("--registerForJava--" + (System.currentTimeMillis() - startTime));

log("----");
log(String.valueOf(a));
log(String.valueOf(b));

findViewById(R.id.cl_content).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(TestJavaExtendLibrary.this, LastPageActivity.class));
}
});

}

private void log(String msg) {
Log.e("TestJavaExtendLibrary", msg);
}

@Override
protected void onDestroy() {
log("onDestroy:" + this.hashCode());
super.onDestroy();
}
}
Loading

0 comments on commit 4505da4

Please sign in to comment.