• Stars
    star
    105
  • Rank 328,196 (Top 7 %)
  • Language
    Java
  • Created almost 8 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A framework can automatically generate OnSaveInstanceState code, support kotlin.自动生成内存恢复的框架,支持kotlin的使用

license JCenter

AutoSave

该框架可以自动生成OnSaveInstanceState代码,保持内存恢复,支持kotlin使用

版本更新说明:

1.0.0 完成基本功能;
1.0.1 全局变量的作用域从之前强制public改成只要非private即可;
1.0.2 修改 SaveHelper.bind(this, savedInstanceState)方法为SaveHelper.recover(this, savedInstanceState),只是重命名,
      以便于理解;
      去掉当内存被回收去调用recover方法时,却没有对应helper类会主动抛异常的情况,方便在BaseAcitviy 和 BaseFragment的
      onSaveInstanceState 和 onRestoreInstanceState 统一添加SaveHelper.save和SaveHelper.recover方法。
1.0.3 优化代码生成,如果一个activity或者fragment中没有有效的@NeedSave注解,但是添加了SaveHelper.recover和SaveHelper.save
      方法,现在就不会自动生成这个类的SaveStateHelper类,减少了无用SaveStateHelper类,便于在Base类中统一集成。
      
2.0.0 去掉NeedSave注解中的isParcelable字段,自动可以支持不同类型;
      如果字段被标记为private在编译的时候会抛异常;
      支持基本所有bundle可以传入的类型,包括SparseParcelableArray等, 如果传入的类型bundle不支持会抛异常(如果有遗漏的类型,请在github 提出issue);
2.0.2 修复通过继承去实现Serializable的对象不能识别的bug;
2.0.3 优化异常提示
2.0.4 修复枚举类型保存的时候不能识别的问题

2.1.0 增加对PersistableBundle的支持,NeedSave注解中设置isPersistable = true则说明该参数保存到PersistableBundle
2.2.6 增加对自定义view的数据保存以及恢复
3.0.0 增加autosave plugin,省去SaveHelper.save 和 SaveHelper.recover的调用
3.0.6 简化引入方式
3.0.7 添加对kotlin的支持
4.0.2 迁移至jitpack,支持gradle tools 4.0+

引入方式

在project的gradle加入下面的依赖:

repositories {
    maven { url 'https://jitpack.io' }
}

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    ...
    classpath 'com.github.JavaNoober.AutoSave:savehelper-plugin:4.0.2'
}

在app的gradle或者module的gradle中加入下面插件即可:

apply plugin: 'AutoSave'

如果需要支持kotlin:
project的gradle:

dependencies {
    ...
    classpath 'com.github.JavaNoober.AutoSave:savehelper-plugin:4.0.2'
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}

在app的gradle或者module的gradle:

apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'AutoSave'
apply plugin: 'android-aspectjx'

android{
    ...
    aspectjx{
        include "com.noober.savehelper"
        exclude 'versions.9'
    }

}

混淆配置:

 -dontwarn  com.noober.**
 -keep class com.noober.api.**{*;}
 -keep class com.noober.savehelper.**{*;}
 -keep class * implements com.noober.savehelper.ISaveInstanceStateHelper {*;}

使用方法

对变量增加@NeedSave注解即可

Activity 和 Fragment

注意:
1.Activity和Fragment中使用的时候必须重写一下onSaveInstanceState方法,或者在父类BaseActivity和BaseFragment 中重写一次即可,否则保存数据的代码会注入失败
2.如果想要自己定义内存恢复的位置可以使用SaveHelper.recover方法 3.如果要在kotlin使用,与在java中使用相同,直接加注解即可,但是不同之出在于:
4.1:如果是基本数据类型,需要多添加一个注解@JvmField 4.2:如果是其他数据类型,需要增加lateinit关键字或者添加一个注解@JvmField 否则会报错"the modifier of the field must not be private, otherwise it won't work"。

public class MainActivity extends AppCompatActivity {

    @NeedSave
    int a = 0;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.tv);
        textView.setText(a + "");
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                a = 2222;
                textView.setText(a + "");
            }
        });
    }


    @Override
    protected void onResume() {
        super.onResume();
        textView.setText(a + "");
        Log.e("MainActivity", a + "");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }
}


public class BlankFragment extends Fragment {
    
    @NeedSave
    String mParam1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
    }
}

class KotlinActivity : AppCompatActivity() {

    @NeedSave
    @JvmField
    var a :Int=3

    @NeedSave
    lateinit var bundle: Bundle

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin)
        Log.e("KotlinActivity",  a.toString())

    }


    override fun onSaveInstanceState(outState: Bundle?) {
        Log.e("KotlinActivity",  "onSaveInstanceState")
        a = 2
        super.onSaveInstanceState(outState)
    }
}

自定义view

public class CustomView extends View {
        
    @NeedSave
    int a;

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
        SaveHelper.save(this, container);
        super.dispatchSaveInstanceState(container);
    }

    @Override
    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
        super.dispatchRestoreInstanceState(container);
        SaveHelper.recover(this, container);
    }
}

具体原理介绍

原理介绍

使用注意

1、如果出现下面的错误,是由aspectj导致的,可以看一下解决issue

java.lang.RuntimeException: Unable to instantiate application xxxxx

More Repositories

1

BackgroundLibrary

A framework for directly generating shape through Tags, no need to write shape.xml again(通过标签直接生成shape,无需再写shape.xml)
Java
3,715
star
2

FloatMenu

A menu style pop-up window that mimics WeChat。仿微信的长按菜单。
Java
176
star
3

Light

a lightweight image compress framework for Android based on libjpeg
Java
112
star
4

LibJpegCompress

android 图片压缩,通过编译libjpeg-turbo来压缩图片,抛弃了原生的bitmap方法,达到了与微信、qq的效果(已编写了一个基于此库的图片压缩框架)
C++
78
star
5

android-apk-decompile

Android decompile tools for mac(安卓apk反编译工具,一键反编译AndroidMainfest.xml layout res等资源以及class文件)
Shell
73
star
6

MedioDecode

硬解码视频,包括h.265视频,同时解码音频并播放
Java
59
star
7

CoroutinesHttp

基于retrofit以及协程的dsl形式的网络请求
Kotlin
25
star
8

CollapseView

Android仿安居客详情展示界面
Java
22
star
9

ExpandableChartView

仿微信清理内存动画
Java
17
star
10

VideoScreen

获取视频的某一帧并显示
Java
15
star
11

TinyCompress

tiny 一键压缩图片插件
Java
9
star
12

AndroidPdf

android pdf一个工具类,可以阅读pdf文件,也可以生成pdf文件
Java
9
star
13

Skin

通过DexClassLoader,调用其他apk的资源
Java
8
star
14

DaggerAndroid

Dagger2Demo
Java
6
star
15

RedPackageHelper

红包助手,同时支持qq(支持口令红包)和微信。
Java
4
star
16

CustomerMvpPlugin

自定义mvp架构插件,一键生成代码
Java
3
star
17

Databurialpoint

android数据埋点实现
Java
2
star
18

KTExtensions

自己常使用的kotlin扩展函数
Kotlin
2
star
19

XPTest

美图秀秀拼图功能
Java
2
star
20

MyLearningDoc

我的学习文章整理
2
star
21

SQLiteDemo

SQLite异步操作处理方法
Java
1
star
22

ASMDemo

Kotlin
1
star
23

JavaNoober

1
star
24

AppInfoDemo

Android系统信息
Java
1
star