将手机升级到8.1开发人员预览后,我的后台服务不再正常启动.
在我长期运行的服务中,我实现了一个startForeground方法来启动正在进行的通知,该通知在create上调用.
@TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
// Safe call, handled by compat lib.
val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
startForeground(101, notification)
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
Process: $PACKAGE_NAME, PID: 24704
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Run Code Online (Sandbox Code Playgroud)
服务通知的通道无效,显然我的旧通道DEFAULT_CHANNEL_ID不再适用于我假设的API 27.什么是合适的渠道?我试图浏览一下文档
service android background-service android-notifications kotlin
下载并安装了最新的Kotlin插件后,我从Android Studio发出了Outdated Kotlin Runtime警告,告诉我:
您在'kotlin-stdlib-1.1.2'库中的Kotlin运行时版本是1.1.2,而插件版本是1.1.2-release-Studio2.3-3.应更新运行时库以避免兼容性问题.
我尝试单击" 更新运行时"按钮,但收到另一条消息:
目前不支持Gradle项目的自动库版本更新.请手动更新build.gradle.
如何解决这个问题?
Kotlin没有与Java中使用的静态字段相同的概念.在Java中,普遍接受的日志记录方式是:
public class Foo {
private static final Logger LOG = LoggerFactory.getLogger(Foo.class);
}
Run Code Online (Sandbox Code Playgroud)
问题是在Kotlin中执行日志记录的惯用方法是什么?
我正在尝试重建我的Android Studio Gradle项目(主要包含Kotlin代码),但它UnableToDeleteFileException在清理/重建过程中开始抛出:
Execution failed for task ':app:clean'.
> Unable to delete file: C:\Users\User\KotlinGameEngine\app\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.0.1\jars\classes.jar
Run Code Online (Sandbox Code Playgroud)
在我尝试更改项目的包结构后,这种情况开始发生.不幸的是,我是通过重命名和移动源文件夹而不是通过Android Studio重构来实现的,这是一个坏主意.
我一整天都在寻找解决这个问题的方法,这些都是我试过无用的东西:
gradle和.gradle目录;.gradle我的用户目录中的目录;gradlew clean从AS终端运行;我尝试了一些有点成功的事情,但只让我再次执行一次干净并重新构建错误之前:
java.exe在AS运行时杀死进程(这在技术上可以每次都完成,但是它很繁琐并且减慢了构建过程)所以似乎编译Java进程可能由于某种原因锁定构建文件,但它也可能与Kotlin有关.我有一个(更成熟的)Java Android项目,我正在努力,虽然我在清理时无法重现此错误.这似乎只发生在我的Kotlin项目上.
有任何想法吗?
提前致谢.
我发现问题是由Kotlin Android插件引起的.当我apply plugin: 'kotlin-android'从模块的build.gradle文件中删除时,问题消失,并在重新插入时返回.随意提供任何洞察力.
最后一次更新不是原因.我发现如果一个项目包含一个Kotlin文件,那么重建和清理就会失败.它继续失败,即使所有Kotlin文件都被删除,直到后台Java进程被杀死,这意味着它对构建文件有某种锁定.我在这里提交了一个错误,其中包含更多细节和重现错误的步骤:KT-9440
android kotlin android-studio android-gradle-plugin kotlin-android-extensions
我正在创建一个Entity(Room Persistence lib)类Food,我想把它foodId作为自动增量.
@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
@PrimaryKey
var foodId: Int = 0
var calories: Double = 0.toDouble()
}
Run Code Online (Sandbox Code Playgroud)
如何设置foodId自动增量字段?
使用新的Android工作室与新的3.0.0 Gradle插件.
当发生一些警告时:
registerResGeneratingTask is deprecated, use
registerGeneratedFolders(FileCollection)
Run Code Online (Sandbox Code Playgroud) 我在数据类中有10+参数,我想用空构造函数初始化数据类,并使用setter仅为少数参数设置值,并将对象传递给服务器.
data class Activity(
var updated_on: String,
var tags: List<String>,
var description: String,
var user_id: List<Int>,
var status_id: Int,
var title: String,
var created_at: String,
var data: HashMap<*, *>,
var id: Int,
var counts: LinkedTreeMap<*, *>,
)
Run Code Online (Sandbox Code Playgroud)
用法:
这样的事情很容易
val activity = Activity();
activity.title = "New Computer"
sendToServer(activity)
Run Code Online (Sandbox Code Playgroud)
但它需要在创建构造函数时传递所有参数.我怎样才能像上面这样简化?
val activity = Activity(null,null,null,null,null,"New Computer",null,null,null,null);
sendToServer(activity)
Run Code Online (Sandbox Code Playgroud) 例如,我有一个字符串列表,如:
val list = listOf("a", "b", "c", "d")
Run Code Online (Sandbox Code Playgroud)
我想将它转换为地图,其中字符串是键.
我知道我应该使用.toMap()函数,但我不知道如何,我还没有看到它的任何例子.
Kotlin挑战赛已经开始.
所有任务都是编写一个控制台程序,从控制台读取参数并将输出写入控制台以进行自动检查.
Kotlin的主要方法看起来像
fun main(args: Array<String>): Unit {
//do something
}
Run Code Online (Sandbox Code Playgroud)
任务中的大多数输入参数都应解释为数字.所以,由于缺乏像Long.valueOf(String s)我刚刚卡住的方法.我无法将String转换为Long,我感到惭愧.
"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static在需要时替换Java .
我很困惑:
companion object块内组合它?:
companion object {
val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种单一的方式.有什么更好的方法?