继承LinearLayout后onDraw方法不调用
init{
//添加这两句代码即可,在onDraw代码中会检测dividerDrawable属性,如果为空就不会调用onDraw
dividerDrawable = ColorDrawable()
showDividers = SHOW_DIVIDER_BEGINNING
}
kotlin中如果方法参数是接口,kotlin中使用lambda表达式,如果lambda表达式内部没有代码,通过编译会变成一个静态变量,多次调用对象一致
Thread {
Log.d("", "")
}.start()
//编译后
(new Thread((Runnable)null.INSTANCE)).start();
sqlite3查看数据库的时候不显示列名,使用.headers on .mode column
使用依赖注入 加 JvmField注解可以不生成get,set方法,并改为public
想要查看源码
将gradle-wrapper.properties文件夹下的gradle下载地址改为all
之前集成Arouter一直失败的原因是没有在gradle文件中加入
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
Arouter的注解处理器,需要在各个模块中显示的引入,不能通过基类包导入
遇到一个使用Arouter无法跳转的问题,原来是主项目没有引入子项目,所以没办法跳转
模块化隐式跳转
对于Service需要进行隐式跳转,需要设置报名,这里的包名不能是所在模块的包名,必须是住模块的包名
intent.action = "remote.aidl.service"
//巨坑,此处需要填写主工程的包名,而不是子模块的包名
intent.setPackage("com.td.moduleproject")
bindService(intent, ConnectCallBack(), Context.BIND_AUTO_CREATE)
<application>
<service android:name="com.td.remoteservice.AidlService"
android:process=":processB"
android:exported="true">
<intent-filter>
<action android:name="remote.aidl.service"/>
</intent-filter>
</service>
</application>
报名需要设置com.td.moduleproject,主项目工程的包名,设置模块包名com.td.remoteservice是找不到这个service的
AIDL文件不生成
AIDL文件只能用纯英文字母,不能有数字或者符号, 需要在生成的文件中添加方法,原始文件是不会生成.java文件的,点击同步生成文件,不行就多点几次,或者clean一下,或者make一下,不行重启AndroidStudio
ViewBind获取不到ViewID
在多模块工程中,如果两个模块中的layout文件名相同,那么ViewBind会获取不到ID 报错信息Missing required view with ID
gradler 7.0+导入AAR包
1.在项目中创建一个根目录创建一个文件夹,将AAR包方进去 2.在新文件夹中创建build.gradle文件 3.build.gradle文件内容为
configurations.maybeCreate("default")
artifacts.add("default", file('BaiduLBS_Android.aar'))
文件结构如下图
4.修改setting文件夹,将创建的文件夹当做模块导入项目
5.修改项目主模块的build.gradle
6.同步一下项目,完成
gradler 下载慢
将项目中的文件下载链接替换为国内的
https://mirrors.cloud.tencent.com/gradle/gradle-7.4-bin.zip
通过透传从锁屏息屏状态下拉起 APP 界面
在 onCreate中添加如下代码,可以在锁屏或者黑屏情况下,通过透传唤醒界面
public void onCreate(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 27){
this.setShowWhenLocked(true);
this.setTurnScreenOn(true);
}else{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
}
引入 aar 包的时候报错
为什么 View.post 方法中可以获取到 View 的高宽
因为Android 的 Handler 中会发送三种消息, 同步消息,异步消息,屏障消息。 我们使用的 View.post 方法发送的是同步消息,而界面绘制发送的是异步消息。这两种消息在平时是没有太大差别的,但是当 Handler 接收到屏障消息后,就会优先执行异步消息,异步消息执行完成后才会执行同步消息。 所以在 View.post 中的代码块会在界面绘制完成后才调用
三星手机WorkManager 报错
报错内容如下 Caused by: java.lang.IllegalStateException: WorkManager is not initialized properly. You have explicitly disabled WorkManagerInitializer in your manifest, have not manually called WorkManager#initialize at this point, and your Application does not implement Configuration.Provider. 需要对 Application进行修改
class BaseBusinessApp : BaseApp(), Configuration.Provider {
// 实现 Configuration.Provider 接口
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.build()
}
override fun onCreate() {
super.onCreate()
// 删除之前手动调用 WorkManager.initialize 的代码
// 保留其他初始化逻辑...
}
}
若还是出现问题可以在在 AndroidManifest.xml 的 标签内添加(这个代码我没有验证,我改了 Application 后就可以用了)
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="disabled"
tools:replace="android:value"/>
在进行暗黑模式适配的时候会,发现使用ViewPage后Fragmnet会报错闪退
是因为在 Fragment 中设置了setRetainInstance(retain: Boolean)。我这边遇到问题是,引入了某个 jar 包出现了这个问题,因为jar 包中持有 Application 的引用,从而监听 Activity 的生命周期,然后全局的 Fragmnet 调用了这个方法。
java.lang.IllegalStateException: Cannot remove Fragment attached to a different FragmentManager. Fragment AddressBookFragment{37d2d09} (a7c5b5dc-685b-45ca-988d-944530b03c06 id=0x7f0a0ba6) is already attached to a FragmentManager