android Service简单使用

class MyService : Service() {

    val mBinder=DownLoadBinder()

    // 继承Binder,内部提供下载方法
    class DownLoadBinder:Binder(){

        fun startDownload(){
            Log.e("MYService", "startDownload: ", )
        }

        fun getProgress(){
            Log.e("MYService", "getProgress: ", )
        }
    }


    override fun onBind(intent: Intent): IBinder {

        return mBinder
    }


    // service创建时调用
    override fun onCreate() {
        Log.e("service", "onCreate: ")
        super.onCreate()
    }

    // 在每次service启动时调用
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.e("service", "onStartCommand: ", )
        return super.onStartCommand(intent, flags, startId)
    }

    // 在service销毁时调用
    override fun onDestroy() {
        Log.e("service", "onDestroy: ", )
        super.onDestroy()
    }
}
/**
 * 在activity中和service绑定
 * 1.创建类并继承自service
 * 2.在manifests中进行注册
 * 3.在service中定义类继承自binder
 * 3.1.           重写onbind方法返回binder类
 * 4、在activity中声明binder变量
 * 4.1在activity中声明一个实现了ServiceConnection对象
 * 4.1.1重写onServiceConnection方法 当activity和service绑定时调用
 * 4.1.2重写onServiceDisconnected方法 当service崩溃了或被强杀时调用
 * 5.启动,绑定service对象
 * 5.1.1 启动service ,使用Context对象的startService(Intent)
 * 5.1.2 关闭service stopSer(Intent) Intent(this:Context,MyService::class.java)
 * 5.2.1 绑定service 使用Context对象bindService(Intent,Connection,flag)
 * 5.2.2 解绑service unbindService(Connection)
 *
 * service生命周期 创建时调用onCreate
 *                启动时调用onStartCommand
 *                绑定时调用onBind
 *                销毁时调用onDestroy
 *  当service 启动并绑定 需关闭service并解绑才会 onDestroy
 */
class MainActivity : AppCompatActivity() {

    lateinit var binding:ActivityMainBinding

    // 声明binder变量
    lateinit var downloadBinder:MyService.DownLoadBinder

    // 创建一个匿名对象并实现ServiceConnection接口
    val connection = object : ServiceConnection {
        // service 绑定时调用
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            downloadBinder = service as MyService.DownLoadBinder
            downloadBinder.startDownload()
            downloadBinder.getProgress()
        }

        // service 崩溃或被强杀时调用
        override fun onServiceDisconnected(name: ComponentName?) {
            Log.e("activity", "onServiceDisconnected: ", )
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)

        setContentView(binding.root)

        binding.btnStart.setOnClickListener {
            val intent:Intent = Intent(this,MyService::class.java)
            // 启动service
            startService(intent)
        }

        binding.btnStop.setOnClickListener {
            val intent=Intent(this,MyService::class.java)
            // 停止service
            stopService(intent)
        }

        binding.btnBind.setOnClickListener {
            val intent=Intent(this,MyService::class.java)
            // 绑定service
            bindService(intent,connection, Context.BIND_AUTO_CREATE)
        }

        binding.btnUnbind.setOnClickListener {
            // 解绑service
            unbindService(connection)
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="56dp"
        android:layout_marginTop="308dp"
        android:text="启动service"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="256dp"
        android:layout_marginTop="308dp"
        android:text="关闭service"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/btn_unbind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="256dp"
        android:layout_marginTop="428dp"
        android:text="unbind"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_bind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="72dp"
        android:layout_marginTop="420dp"
        android:text="bind"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

### 解决 PP-OCRv4 出现的错误 当遇到 `WARNING: The pretrained params backbone.blocks2.0.dw_conv.lab.scale not in model` 这样的警告时,这通常意味着预训练模型中的某些参数未能匹配到当前配置下的模型结构中[^2]。 对于此问题的一个有效解决方案是采用特定配置文件来适配预训练权重。具体操作方法如下: 通过指定配置文件 `ch_PP-OCRv4_det_student.yml` 并利用已有的最佳精度预训练模型 (`best_accuracy`) 来启动训练过程可以绕过上述不兼容的问题。执行命令如下所示: ```bash python3 tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml ``` 该方案不仅解决了参数缺失带来的警告,还能够继续基于高质量的预训练成果进行微调,从而提升最终检测效果。 关于蒸馏的概念,在机器学习领域内指的是将大型复杂网络(teacher 模型)的知识迁移到小型简单网络(student 模型)。这里 student 和 teacher 的关系是指两个不同规模或架构的神经网络之间的指导与被指导的关系;其中 teacher 已经经过充分训练并具有良好的性能,而 student 则试图模仿前者的行为模式以达到相似的效果但保持更高效的计算特性。 至于提到的 `Traceback` 错误信息部分,由于未提供具体的跟踪堆栈详情,难以给出针对性建议。不过一般而言,这报错往往涉及代码逻辑错误或是环境配置不当等问题。为了更好地帮助定位和解决问题,推荐记录完整的异常日志,并仔细检查最近修改过的代码片段以及确认依赖库版本的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值