<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Ser_Bad的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/Ser_Bad</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; Ser_Bad]]></copyright><item><title><![CDATA[动态规划在算法中的实践]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/136652083</link><guid>https://blog.csdn.net/Ser_Bad/article/details/136652083</guid><author>Ser_Bad</author><pubDate>Tue, 12 Mar 2024 14:42:57 +0800</pubDate><description><![CDATA[为了提高算法的效率，动态规划是在算法实践中经常使用的一个思想，有些问题会非常适合使用动态规划的思想来设计算法。本文将借助LeetCode上的一些例子，来讲解和说明动态规划在算法案例中的一些实践。]]></description><category></category></item><item><title><![CDATA[哈希思想在算法中的实践]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/136651980</link><guid>https://blog.csdn.net/Ser_Bad/article/details/136651980</guid><author>Ser_Bad</author><pubDate>Tue, 12 Mar 2024 14:41:10 +0800</pubDate><description><![CDATA[为了提高算法的效率，哈希思想是在算法实践中很有用的的一个方法，合理运用哈希思想来解决算法问题，可以有效的帮助我们解决算法问题，尤其是有些问题非常适合使用哈希思想来解决。本文将借助LeetCode上的一些例子，来讲解和说明哈希思想在算法案例中的一些实践案例。]]></description><category></category></item><item><title><![CDATA[使用python为aab签名和生成apk]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/125639374</link><guid>https://blog.csdn.net/Ser_Bad/article/details/125639374</guid><author>Ser_Bad</author><pubDate>Wed, 06 Jul 2022 14:39:30 +0800</pubDate><description><![CDATA[生产aab格式的文件后，为了上传到google play还需要签名的，还有从生成aab到生成可以安装用的apk要花蛮多步骤的。
所以，这里用Python做下自动化简化下步骤
其中是来自于https://github.com/google/bundletool/releases 可以替换成你自己需要的jar使用方法是：
或者，在Android项目中的，新建一个task，可以替换成自己需要的文件目录
然后使用下面的命令就可以上传了。
本项目地址存放在，https://github.com/SerBad/RunB]]></description><category></category></item><item><title><![CDATA[使用python自动上传apk到蒲公英]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/125637799</link><guid>https://blog.csdn.net/Ser_Bad/article/details/125637799</guid><author>Ser_Bad</author><pubDate>Wed, 06 Jul 2022 13:26:57 +0800</pubDate><description><![CDATA[新建文件，代码如下
在Android项目中的，新建一个task，可以替换成自己需要的文件目录
需要注意的是，新版本的apk不在outputs下面了，是在下面。
然后使用下面的命令就可以上传了。]]></description><category></category></item><item><title><![CDATA[Messenger传输大的数据]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/120673351</link><guid>https://blog.csdn.net/Ser_Bad/article/details/120673351</guid><author>Ser_Bad</author><pubDate>Sat, 09 Oct 2021 16:07:09 +0800</pubDate><description><![CDATA[Messenger作为跨进程，是很常用的方法，轻便，已经基于AIDL做了很多的封装了，但是这个方法只能传输比较小的数据，如果要传输大一些的数据咋办呢？可以使用Bundle.putBinder，我这里做个记录：
首先创建一个aidl，GetLargeOne.aidl
// GetLargeOne.aidl

// Declare any non-default types here with import statements

//为了解决传输数据量很大的时候处理的情况
interface GetLarge]]></description><category></category></item><item><title><![CDATA[Room数据库迁移记录]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/113989379</link><guid>https://blog.csdn.net/Ser_Bad/article/details/113989379</guid><author>Ser_Bad</author><pubDate>Tue, 23 Feb 2021 14:56:53 +0800</pubDate><description><![CDATA[记录一下Room数据库迁移过程中遇到的问题。要迁移Room数据库，只要需要实现androidx.room.migration.Migration即可。
下面记录三种情况

修改表的结构

object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        //  创建新的临时表
        database.execSQL("CREATE TABLE publish_post_bea]]></description><category></category></item><item><title><![CDATA[Android使用ActivityResultContract]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/113988671</link><guid>https://blog.csdn.net/Ser_Bad/article/details/113988671</guid><author>Ser_Bad</author><pubDate>Tue, 23 Feb 2021 14:45:13 +0800</pubDate><description><![CDATA[从AndroidX的Activity&nbsp;1.2.0-alpha02&nbsp;和&nbsp;Fragment&nbsp;1.3.0-alpha02开始，startActivityForResult被标注为弃用了，因为多了一种新的办法，这里做个记录。
新建一个自己的契约类ActivityResultContract，继承自ActivityResultContract，写上自己要传入的参数和要返回的结果。
class PersonalActivityResultContract : ActivityRe]]></description><category></category></item><item><title><![CDATA[分享一段ViewPager2中RecyclerView滑动的问题]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/113309082</link><guid>https://blog.csdn.net/Ser_Bad/article/details/113309082</guid><author>Ser_Bad</author><pubDate>Thu, 28 Jan 2021 10:19:23 +0800</pubDate><description><![CDATA[在ViewPager2中插入RecyclerView，滑动过于敏感，下面记录一种方法，其实就是重新处理事件分发。]]></description><category></category></item><item><title><![CDATA[ViewModel中传入Context的方法]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/111637963</link><guid>https://blog.csdn.net/Ser_Bad/article/details/111637963</guid><author>Ser_Bad</author><pubDate>Thu, 24 Dec 2020 16:29:41 +0800</pubDate><description><![CDATA[ViewModel使用的越来越多了，严格来说，官方并不建议你在ViewModel中添加Context的引用。同时，ViewModel的构造方法是没有任何参数的，有的时候会很不灵活。以下记录两种方法。
#1.通过kotlin的拓展函数

fun &lt;T : ViewModelProvider, V : ViewModel&gt; T.get(
    key: String,
    modelClass: Class&lt;V&gt;,
    context: FragmentActivity
): ]]></description><category></category></item><item><title><![CDATA[分享一段Android权限设置的代码]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/109995958</link><guid>https://blog.csdn.net/Ser_Bad/article/details/109995958</guid><author>Ser_Bad</author><pubDate>Mon, 23 Nov 2020 14:41:16 +0800</pubDate><description><![CDATA[检查是否有通知栏权限
NotificationManagerCompat.from(context).areNotificationsEnabled()

打开通知栏权限设置页
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings

object NotificationUtil {]]></description><category></category></item><item><title><![CDATA[新版gradle移除versionCode和versionName的问题]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/109995482</link><guid>https://blog.csdn.net/Ser_Bad/article/details/109995482</guid><author>Ser_Bad</author><pubDate>Mon, 23 Nov 2020 14:29:51 +0800</pubDate><description><![CDATA[从com.android.tools.build:gradle:4.1.0开始，build.gradle文件正式移除了versionName和versionCode，参照链接。
如果依然需要BuildConfig.VERSION_NAME的话，可以使用如下方式
buildConfigField "int", 'VERSION_CODE', String.valueOf(1)
buildConfigField 'String', 'VERSION_NAME', "\"" + "1.0.0" + "\""

但]]></description><category></category></item><item><title><![CDATA[Android一个标签页的实现]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/109445477</link><guid>https://blog.csdn.net/Ser_Bad/article/details/109445477</guid><author>Ser_Bad</author><pubDate>Mon, 02 Nov 2020 11:25:38 +0800</pubDate><description><![CDATA[最近要实现一个类似于下面的页面

想着每次都要自己重新写，太麻烦了，这里记录一下自己写的自定义的view。一开始本来准备用ConstraintLayout的，但是这货addview的时候总有bug，就用RelativeLayout了。
package com.android.demo.view

import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.wid]]></description><category></category></item><item><title><![CDATA[记录一个PIL把透明背景转成白色背景的方法]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/106762611</link><guid>https://blog.csdn.net/Ser_Bad/article/details/106762611</guid><author>Ser_Bad</author><pubDate>Mon, 15 Jun 2020 14:54:27 +0800</pubDate><description><![CDATA[起先在百度上搜到的文章，的确可以做到透明背景转成白色背景，但是缺陷非常严重，会导致图的背景产生很多像素点，而且效率也不是很高。
又经过了一番搜索之后，发现了一个更好的办法。
from PIL import Image

try:
    imagePtah = 'your image file path'
    img = Image.open(imagePtah)
    if img.mode != 'RGBA':
        image = img.convert("RGBA")
    wid]]></description><category></category></item><item><title><![CDATA[多模块下的页面跳转]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/106687720</link><guid>https://blog.csdn.net/Ser_Bad/article/details/106687720</guid><author>Ser_Bad</author><pubDate>Thu, 11 Jun 2020 14:13:16 +0800</pubDate><description><![CDATA[在多模块下或者组件化下，页面跳转是比较麻烦处理的一个地方，下面记录一下跳转的方法。以下应用包名统一用com.android.demo来指代。
BroadcastReceiver
使用广播是最简单的办法，可以通过注册广播来处理页面跳转。需要注意的是，从7.0开始广播开始受到限制，对于应用广播，可以用以下方法，到10.0及以下都是可以在多种机型上可以的。同样的，也可以用Activity来处理。基本逻辑是一样的，这里不再赘述。
在AndroidManifest.xml，permission和uses-permis]]></description><category></category></item><item><title><![CDATA[Android子模块下productFlavors的配置]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/105636460</link><guid>https://blog.csdn.net/Ser_Bad/article/details/105636460</guid><author>Ser_Bad</author><pubDate>Mon, 20 Apr 2020 15:33:39 +0800</pubDate><description><![CDATA[以下文章说明中，_android、_test、_google代表的是Flavors，debug和release代表的是buildTypes，提前说明，根据你自己的项目需要，也许有所不同。
在多模块下，子模块的Flavors该如何设置呢？其实不用什么特别的设置，只需要子模块保持和主模块一样的Flavors就行，然后按照以下来引用就好了。需要注意的是，两者要保持一致，只许子模块比主模块的Flavors...]]></description><category></category></item><item><title><![CDATA[Android透明度百分比对应的十六进制]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/103247924</link><guid>https://blog.csdn.net/Ser_Bad/article/details/103247924</guid><author>Ser_Bad</author><pubDate>Mon, 25 Nov 2019 23:23:45 +0800</pubDate><description><![CDATA[Android透明度百分比对应的十六进制]]></description><category></category></item><item><title><![CDATA[Android关于裁剪图片透明区域的算法]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/90607018</link><guid>https://blog.csdn.net/Ser_Bad/article/details/90607018</guid><author>Ser_Bad</author><pubDate>Mon, 27 May 2019 17:12:04 +0800</pubDate><description><![CDATA[最近项目中遇到这么一个需求，需要裁剪掉图片的透明区域。找了很久，最后确定，只能通过自己读取Bitmap的像素点来读取图片的边界来裁剪。下面记录一下过程。
原图如下
PorterDuffXfermode
最开始想的是使用PorterDuffXfermode来处理，因为这种方式其实很快的，但是，虽然这种方式可以用来处理图片，但是无法满足获取图片边界的需求。
代码如下：
    public stati...]]></description><category></category></item><item><title><![CDATA[Android加载animated webp的控制和Glide加载GIF]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/88345435</link><guid>https://blog.csdn.net/Ser_Bad/article/details/88345435</guid><author>Ser_Bad</author><pubDate>Fri, 08 Mar 2019 13:26:52 +0800</pubDate><description><![CDATA[因为动态的webp使用的也越来越多了，所以这里记录一种加载处理的办法。目前常用的Android图片加载库，只有fresco是可以直接加载animated webp的。那么如何处理呢？记录一下，不然坑都白踩了。本质上webp和gif都是一组图片组成的连续图片，如果要单独解析每一帧怎么办呢。
Android支持
如果要拿到webp的第一帧，在Android以上是可以直接使用如下这种方法，默认取的是第一...]]></description><category></category></item><item><title><![CDATA[Glide4的一次踩坑记录]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/88237163</link><guid>https://blog.csdn.net/Ser_Bad/article/details/88237163</guid><author>Ser_Bad</author><pubDate>Wed, 06 Mar 2019 15:14:41 +0800</pubDate><description><![CDATA[如果你用图片加载库直接加载图片，并不需要做任何处理，那么，其实大多数时候你用任何加载库并没有太大的区别。一旦你需要处理各种各样的图片的时候，你就会遇到各种各样的问题了。这里记录一个关于Glide的问题，一下都是Glide4.9版本。
在Glide中加载图片，可以很简单，类似于这样就可以了：
   Glide.with(context)
      .load(url)
      .into(im...]]></description><category></category></item><item><title><![CDATA[Android共享元素]]></title><link>https://blog.csdn.net/Ser_Bad/article/details/87913305</link><guid>https://blog.csdn.net/Ser_Bad/article/details/87913305</guid><author>Ser_Bad</author><pubDate>Mon, 25 Feb 2019 11:03:19 +0800</pubDate><description><![CDATA[在这里记录一下android共享元素的方法，踩了满多坑的，其实蛮简单的，Android共享是从Android5.0开始提供的，之前的版本我没有去碰兼容，但是其实是有解决方法的。这里只是记录一下踩过的坑，不对共享元素做深入的分析。

首先从页面A跳转到页面B，那么页面A只需要调用
ActivityCompat.startActivity(context, intent, ActivityOption...]]></description><category></category></item></channel></rss>