海创软件组--20200614--两周小结

PendingIntent


是在某个合适的时机去执行某个动作,理解为延迟执行的Intent。看《第一行代码》的时候说有三个静态方法可以获得它的实例,这四个方法接收的参数一样:Context,requestCode,Intent,flags。书中并没有详细介绍第二和第四个参数的含义,因此去查了下资料。
第二个参数是请求码,请求码不同就能产生多个PendingIntent。第四个参数是用于确定PendingIntetn的行为,有四个值可选:

   - FLA_ONE_SHOT:该PendingIntent只作用一次.在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,此后如果再调用send()方法的话将会失败,系统将会返回一个SendIntentException.

   - FLAG_NO_CREATE:如果AlarmManager管理的PendingIntent已经存在,那么将不进行任何操作,若描述的Intent不存直接返回NULL(空)
   
   - FLAG_CANCEL_CURRENT:如果AlarmManager管理的PendingIntent已经存在,那么将会取消当前的PendingIntent,从而创建一个新的PendingIntent.
   
   - FLAG_UPDATE_CURRENT:如果AlarmManager管理的PendingIntent已经存在,让新的Intent更新之前Intent对象数据,

 如果用不到去设置它的行为此参数位可以传0。
  • 总的来说PendingIntent是对真实Intent的一种封装载体,可以用来在出发时,根据Intent 唤起目标组件,如 Activity,Service,BroadcastReceiver 等。

如何对图片进行压缩再加载到内存中


看书的时候看到了这个问题,但书上没有给出解答,因此去查资料。
已知图片有三种存在形式:硬盘上时是file,网络传输时是stream,内存中是stream或bitmap。
Android 中加载图片的颜色模式有四种,分别是:

  • ALPHA_8:每个像素占用 1byte 内存

  • ARGB_4444:每个像素占用 2byte 内存

  • ARGB_8888:每个像素占用 4byte 内存

  • RGB_565:每个像素占用 2byte 内存。

    Android默认的颜色模式为ARGB_8888,此颜色模式色彩最细腻,显示质量最高,占用的内存也最大。

    通过查资料查到了BitmapFactory这个类提供了多个解析方法用于创建Bitmap对象,可根据图片的来源选择合适的方法。以下是通过查资料得到的BitmapFactory创建Bitmap的几种方法说明:

    • public static Bitmap decodeByteArray (byte[] data, int offset, int length, BitmapFactory.Options opts)
      参数
      data 压缩图像数据的字节数组
      offset 图像数据偏移量,用于解码器开始从哪儿解析.
      length 字节数,以偏移量开始,去解析
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      返回值
      返回解码后的位图,或者如果图像数据不能被解码返回为空,或者 如果选项不是空,如果选项要求仅仅返回大小(opts.outWidth and opts.outHeight)。
      从指定的字节数组中解码一个不可变的位图。

    • public static Bitmap decodeByteArray (byte[] data, int offset, int length)
      参数
      data 压缩图像数据的字节数组
      offset 图像数据偏移量,用于解码器开始从哪儿解析.
      length 字节数,以偏移量开始,去解析
      返回值
      返回解码后的位图,或者如果图像数据不能被解码返回为空
      从指定的字节数组中解码一个不可变的位图。

    • public static Bitmap decodeFile (String pathName)
      参数
      pathName 解码文件的全路径名
      返回值
      返回结果是解码的位图,或者如果不能解码则返回空。
      从文件中解码生成一个位图。如果支付的文件名为空,或者不能解码出一个位图,方法将返回空。

    • public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)
      参数
      pathName 解码文件的全路径名
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      Returns
      返回解码后的位图,或者如果图像数据不能被解码返回为空,或者 如果选项不是空,如果选项要求仅仅返回大小(opts.outWidth and opts.outHeight)。
      从文件中解码生成一个位图。如果支付的文件名为空,或者不能解码出一个位图,方法将返回空。

    • public static Bitmap decodeFileDescriptor (FileDescriptor fd)
      参数
      fd 包含解码位图数据的文件路径
      返回值
      返回解码的位图或者空。

    • public static Bitmap decodeFileDescriptor (FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)
      参数
      fd 包含解码位图数据的文件路径
      outPadding 如果不为空,返回矩形的内边距如果位图存在,否则设置内边距为(-1,-1,-1,-1).如果没有位图返回空,内边距不改变
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      返回值
      返回解码的位图或者空。

    • public static Bitmap decodeResource (Resources res, int id, BitmapFactory.Options opts)
      参数
      res 包含图像数据的资源对象
      id 图像数据的资源的id
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      返回值

    • public static Bitmap decodeResourceStream (Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)
      从输入流中解码一个新位图。输入了获得资源,我们可以缩放位图。

    • public static Bitmap decodeResource (Resources res, int id)
      参数
      res 包含图像数据的资源对象
      id 图像数据的资源的id
      返回值
      返回解码后的位图,或者如果图像数据不能被解码返回为空
      从输入流中解码位图。与decodeResource(Resources, int, android.graphics.BitmapFactory.Options)当Options是空时同义,

    • public static Bitmap decodeResource (Resources res, int id, BitmapFactory.Options opts)
      参数
      res 包含图像数据的资源对象
      id 图像数据的资源的id
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      返回值
      返回解码后的位图,或者如果图像数据不能被解码返回为空,或者 如果选项不是空,如果选项要求仅仅返回大小(opts.outWidth and opts.outHeight)。
      从资源中解码一个位图。与decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options)同义.

    • public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)
      参数
      is 持有原始数据用于解码位图的输入流
      outPadding 如果不为空,返回矩形的内边距如果位图存在,否则设置内边距为(-1,-1,-1,-1).如果没有位图返回空,内边距不改变
      opts 可以为空,控制采样率和实付图像完全被解码的选项,或者仅仅返回大小
      Returns
      返回解码后的位图,或者如果图像数据不能被解码返回为空,或者 如果选项不是空,如果选项要求仅仅返回大小(opts.outWidth and opts.outHeight)。
      从输入流中解码一个位图。如果输入了为空,或者不能解码位图,方法返回空。流的位置觉得解码数据从哪儿读取。

    • public static Bitmap decodeStream (InputStream is)
      Decode an input stream into a bitmap. If the input stream is null, or cannot be used to decode a bitmap, the function returns null. The stream’s position will be where ever it was after the encoded data was read.
      参数
      is 持有原始数据用于解码位图的输入流
      返回值
      返回解码后的位图,或者如果图像数据不能被解码返回为空

一般来说,是根据图片的来源来选择方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。

SignleInstance的新建栈中能有多个Activity吗?


不能。这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

服务的两种启动方式的区别


startService()和bindService()两种启动方式:

  • startService(),启动完之后该service就在后台运行,其生命周期跟启动它的Context没有任何关系。活动不能调用服务里面的方法。

  • bindService()启动之后生命周期跟启动它的Context有关。在Context中解绑之后,如果该Service没有任何绑定后该Service也就结束。活动可以调用服务里面的方法。

所以一个服务如果要被销毁,必须是不满足被启动和被绑定两个条件。

你可能感兴趣的:(海创软件组)