项目笔记2

项目笔记:
1、Gson在功能上面无可挑剔,在性能上面比FastJson差点
   FastJson在复杂类型的Bean转Json上会出现一些问题,可能会出现引用类型,导致JSON转换出错,需要定制引用
   FastJson由阿里巴巴采用独创的算法,将parse速度提升到极致,超过所有json库
   如果性能上面有要求,可使用Gson将bean转换为json确保数据的正确,使用FastJson将JSON转为bean
   bean转json用Gson:
   Gson gson = new Gson();
   String json = gson.toJson(obj);
   json转bean用FastJson:
   Bean bean = JSON.parseObject(json,Bean.class);
   json转复杂bean用FastJson:
   List list = JSON.parseObject(json,new TypeReference<ARRAYLIST>(){});
   Set set = JSON.parseObject(json,new TypeReference<HASHSET>(){});
   json转bean用GSON(不在乎性能):
   Gson gson = new Gson();
   Bean bean = gson.fromJson(json,Bean.class);
   json转复杂bean用Gson(不在乎性能):
   Gson gson = new Gson();
   List<Bean> beanList = gson.fromJson(json,new TypeToken<List<Bean>>(){}.getType());
  
2、Java泛型(泛型类获取实例对象方法)
    参数:Class<T> classN
    T info = classN.newInstance();(当T有无参构造函数时)
T info = classN.getConstructor(JSONObject.class).newInstance(jsonObject)(当T要用到有参构造函数时)
--JSONObject.class为参数类型,jsonObject为传进来的数据


3、关于子类父类构造方法:
   class A{
    public A(){};
public A(String name){};
   }
   class B extends A{
   }
   --子类不能继承父类的构造方法,但是实例化子类的时候会调用父类的构造方法
   --B没有申明构造方法的时候,可以用new B(),此时子类会自动调用父类的无参构造函数
   --B中申明一个有参构造函数public B(String name){},new B("haha")会先调用父类的无参构造函数,再调用子类的构造函数
   --子类实例化对象时,如果子类构造函数没有显示调用父类构造器,子类会自动调用父类的无参构造函数
   --如果父类没有申明无参构造函数,子类构造器没有显示调用父类构造器,则编译报错
   
4、Error:java.lang.RuntimeException: Annotation processors must be explicitly declared now. 
   The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration
   解决办法:(注解适配问题,新的gradle插件不再支持annotation processors)
   在module的build.gradle文件的defaultConfig里面配置
   javaCompileOptions{
    annotationProcessorOptions{
 includeCompileClasspath false
}
   }
   
5、ButterKnife(解放控件对象实例化findViewById,解放各种点击事件比如setOnClickListener)
   用法:
   build.gradle文件配置:
   compile 'com.jakewharton:butterknife:8.8.1'
   annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
   在setContentView(R.layout.activity_main)之后加一句ButterKnife.bind(this);
   获取控件对象实例:
   @BindView(R.id.button01)
   Button button01;
   控件点击事件实现方法一:
   button01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"李易峰",Toast.LENGTH_LONG).show();
            }
        });)
控件点击事件实现方法二:
@OnClick(R.id.button02)
void btnClick(){
Toast.makeText(MainActivity.this,"李钟硕",Toast.LENGTH_LONG).show();
}

6、android 闹钟设置
    //定时检查 AbsWorkService 是否在运行,如果不在运行就把它拉起来
        //Android 5.0+ 使用 JobScheduler,效果比 AlarmManager 好
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            JobInfo.Builder builder = new JobInfo.Builder(HASH_CODE, new ComponentName(DaemonEnv.sApp, JobSchedulerService.class));
            builder.setPeriodic(DaemonEnv.getWakeUpInterval());
            //Android 7.0+ 增加了一项针对 JobScheduler 的新限制,最小间隔只能是下面设定的数字
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) builder.setPeriodic(JobInfo.getMinPeriodMillis(), JobInfo.getMinFlexMillis());
            builder.setPersisted(true);
            JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
            scheduler.schedule(builder.build());
        } else {
            //Android 4.4- 使用 AlarmManager
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            Intent i = new Intent(DaemonEnv.sApp, DaemonEnv.sServiceClass);
            sPendingIntent = PendingIntent.getService(DaemonEnv.sApp, HASH_CODE, i, PendingIntent.FLAG_UPDATE_CURRENT);
            am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + DaemonEnv.getWakeUpInterval(), DaemonEnv.getWakeUpInterval(), sPendingIntent);
        }
//使用定时 Observable,避免 Android 定制系统 JobScheduler / AlarmManager 唤醒间隔不稳定的情况
        sDisposable = Observable
                .interval(DaemonEnv.getWakeUpInterval(), TimeUnit.MILLISECONDS)
                .subscribe(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        DaemonEnv.startServiceMayBind(DaemonEnv.sServiceClass);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                    }
                });
 //守护 Service 组件的启用状态, 使其不被 MAT 等工具禁用
        getPackageManager().setComponentEnabledSetting(new ComponentName(getPackageName(), DaemonEnv.sServiceClass.getName()),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
/**
     * 最近任务列表中划掉卡片时回调
     */
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        onEnd(rootIntent);
    }
//启动前台服务而不显示通知的漏洞已在 API Level 25 修复
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
                //利用漏洞在 API Level 17 及以下的 Android 系统中,启动前台服务而不显示通知
                startForeground(HASH_CODE, new Notification());
                //利用漏洞在 API Level 18 及以上的 Android 系统中,启动前台服务而不显示通知
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
                    DaemonEnv.startServiceSafely(new Intent(getApplication(), WorkNotificationService.class));
            }
//判断本机上是否有能处理当前Intent的Activity
PackageManager pm = DaemonEnv.sApp.getPackageManager();
        List<ResolveInfo> list = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
当list != null && list.size() > 0时表明有能处理当前Intent的Activity
    //防止华为机型未加入白名单时按返回键回到桌面再锁屏后几秒钟进程被杀
public static void onBackPressed(Activity a) {
        Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
        launcherIntent.addCategory(Intent.CATEGORY_HOME);
        a.startActivity(launcherIntent);
    }
   

学习链接:http://www.jianshu.com/p/1f919c6eeff6


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值