当前位置: 首页 > news >正文

处理屏幕旋转导致的重建,单例对象,StringBuilder进行拼接,ProGurad 混淆,VectorDrawable 及 AnimatedVectorDrawable,IntentService

 

处理屏幕旋转导致的重建

当屏幕发生旋转时,如果我们没有在AndroidManifest.xml中,对其configChanges属性进行声明,那么就会导致Activity进行重建,此时,就需要重新加载Activity所需要展示的数据。

在EditText控件中输入后,当屏幕旋转后,里面的内容就会不见,activity进行了重建,但是checkBox不会重建。

此时,我们就可以对其进行如下的声明:

 

android:configChanges="keyboardHidden|orientation|screenSize"

接着在ActivityonConfigurationChanged进行监听,对布局进行相应的改变,而不需要重新加载数据。

单例对象在需要的时候初始化

在使用单例时,我们应当仅在使用到该单例时才去初始化它,这里我们可以通过“静态初始化会在类被加载时触发”这一原理,来实现懒加载。

 

public class OptSingleton {
    
    private OptSingleton() {}
    
    public static OptSingleton getInstance() {
        return Holder.INSTANCE;
    }
    
    private static class Holder {
        public static final OptSingleton INSTANCE = new OptSingleton();
    }
}

采用StringBuilder的方式进行拼接:

    public static void goodString() {
        StringBuilder result = new StringBuilder("result");
        String append = "append";
        for (int i = 0; i < (1 << 20); i++) {
            result.append(append);
        }
    }

 

减少不必要的异常

在某些时候,如果我们能预见到某些有可能会发生异常的场景,那么提前进行判断,将可以避免由于异常所带来的代价,以启动第三方应用为例,我们可以先判断该intent所对应的应用是否存在,再去启动它,而不是等到异常发生时再去捕获:

    public static void startApp(Context context) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("www.qq.com"));
        intent.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
        if (intent.resolveActivity(context.getPackageManager()) == null) {
            return;
        }
        try {
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

使用 ProGurad 优化代码

通过ProGuard对代码进行优化、压缩、混淆,可以移除不需要的代码、重命名类、域与方法等,做法就是在buildTypes的指定类型下增加下面的代码:

    buildTypes {
        release {
            //对于release版本采用进行混淆。
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }
        debug {
            //对于debug版本不混淆。
            minifyEnabled false
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }

这里的混淆规文件有两份,如果有多份,那么可以使用逗号分隔,第一个是Android自带的混淆文件,而第二个则是应用自定义的混淆规则文件,关于混淆文件的语法,

 

VectorDrawable 及 AnimatedVectorDrawable 使用详解:

https://www.jianshu.com/p/723dc385eafe

 

对于只执行一次的后台任务,使用 IntentService 替代 Service

当我们需要将某些任务的生命周期和Activity分离开来,那么一般会使用Service,但是Service就需要我们进行手动管理,如果忘记,那么将会导致额外的内存占用,并且拥有Service进程的oom_adj值一般会高于没有Service的进程,系统会更倾向于将它保留。

对于一些短时的后台任务,我们可以考虑采用IntentService它的onHandleIntent回调是在异步线程中执行的,并且任务执行完毕后,该Service会自动销毁,不需要手动管理。

 

 ViewStub 动态加载布局

<include> 进行布局复用:

 SpannableStringBuilder 替换多个 TextView 

 LinearLayout 自带的分割线:

    android:showDividers="beginning|end|middle"

 

 Space 控件进行合理的占位:

  <android.support.v4.widget.Space
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"/>

 

 TextView 的 drawableLeft/drawableTop 

 AsyncLayoutInflater 异步加载;

 public void onClick(View v) {
                AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(OptActivity.this);
                asyncLayoutInflater.inflate(R.layout.layout_async, root, new AsyncLayoutInflater.OnInflateFinishedListener() {

                    @Override
                    public void onInflateFinished(View view, int resId, ViewGroup parent) {
                        parent.addView(view);
                    }
                });

 

相关文章:

  • SVG,Vector,gradle
  • 蓝牙通讯数据传输,蓝牙UUID,BluetoothAdapter;adb input 模拟系统输入,adb logcat:抓包,抓日志,蓝牙通讯,adb命令实现手机之间互相控制,虚拟按键
  • gradle中的 compileSdkVersion minSdkVersion targetSdkVersion
  • android 解决中文乱码,reload和cnvert区别
  • JetGradlePlugin,transformDexArchiveWithExternalLibsDexMergerForDebug
  • jcenter()和mavenCentral()区别
  • v4 v7包的使用,Android Gradle的理解,版本号对应Gradle发行版本
  • 程序员接私活
  • aapt问题,compileSdkVersion、buildToolsVersion、buildToolsVersion、 com.android.support:appcompat-v7版本问题
  • 幸存者偏差
  • 取消Android Studio更新提示和断网实现 快速编译运行代码
  • ps处理后的透明背景图片,怎么保存为JPG背景又是白色了,设置button点击效果,实现换背景 。 Android控件绑定代码快速生成工具,通过layout生产class文件
  • AndroidStudio导入jar很便捷; eclipse导入jar不一样;
  • 证券中 A、B、C、D字头账号分别代表什么?
  • RxJava+Retrofit示例 ,Retrofit 注解学习
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Babel配置的不完全指南
  • CSS实用技巧
  • javascript面向对象之创建对象
  • javascript数组去重/查找/插入/删除
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel5.4 Queues队列学习
  • Redis中的lru算法实现
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 包装类对象
  • 聊一聊前端的监控
  • 设计模式走一遍---观察者模式
  • 使用 @font-face
  • 我建了一个叫Hello World的项目
  • 正则与JS中的正则
  • 第二十章:异步和文件I/O.(二十三)
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #传输# #传输数据判断#
  • (1) caustics\
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)hibernate配置管理
  • (分享)自己整理的一些简单awk实用语句
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一) storm的集群安装与配置
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .project文件
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @RequestMapping 的作用是什么?
  • @RequestMapping处理请求异常
  • @Transactional类内部访问失效原因详解
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [20171102]视图v$session中process字段含义