随手记

1、自定义View,onMeasure(int widthMeasureSpec,int heightMeasureSpec),这个参数是从根布局DecorView一路传递给子View的父容器对子View的期望(约束值)和子View自身宽高值共同影响下计算出的值,如果自定义控件想要像系统控件(TextView、Button)一样在任何weight、height中都能自动适配,不用开发者特殊处理的话,在此处取出widthMeasureSpec,heightMeasureSpec,去setMeasuredDimension
2、自定义View,onSizeChange这个函数应当是在控件成型的时候去调用的,网上都说是控件的宽高发生改变的时候调用(发生改变,当然也包括第一次绘制控件,这时候宽高是从0,0改变为真实值),实验发现,onSizeChange的参数值,w h 这个值 与 onMeasure函数中setMeasuredDimension(w,h)这个w和h 完全相同,也就是说是这里的值传递过去的,所以我说onSizeChange这个函数应当是在控件成型的时候去调用的
3、Android跨进程通讯的方式有:文件(不能实时通讯),隐式的用Activity的Intent传递值,contentProvider,广播,AIDI,Messenger(无法提供RPC,服务端和客户端用同一个Messenger来发消息,用同一个消息队列来维护通讯),
4、有时我们会在磁盘上存储一个层级很深的目录,但是一个一个new File(“filePath”)又太low,可以使用这一api,
 if (!file.getParentFile().exists()) {
    file.getParentFile().mkdirs();
  }
它会将file上所有的Path都检查并创建
5、从android 8.0开始Google不允许应用程序启动不可见的后台服务,也就是在API 26开始,一个service 不可以以startService(new Intent())方式开启,而是使用startForegroundService,且当调用完startForegroundService(new Intent())开启后,要在5s内的时间调用这个服务的startForeground()方法不然会报异常,Try{}catch(){}都捕获不了异常,什么叫调用这个服务的startForeground()? 就是说在服务的onCreate方法中调用

public void startService() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //配置弹出通知时的某些属性,比如灯光颜色,震动铃声等等
            NotificationChannel channel = new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            manager.createNotificationChannel(channel);

            Notification notification = new Notification.Builder(this,"id").build();
            startForeground(1,notification);
            
        }

你可能感兴趣的:(android)