Java 当应用程序关闭时,服务被终止
我有一个主服务,它应该始终在我的Android应用程序的后台运行,用于处理蓝牙设备连接并向其提供数据 根据这些问题,如果我的服务在我的应用程序进程中,在应用程序关闭时被杀死,这是一种正常的行为Java 当应用程序关闭时,服务被终止,java,android,process,android-service,kotlin,Java,Android,Process,Android Service,Kotlin,我有一个主服务,它应该始终在我的Android应用程序的后台运行,用于处理蓝牙设备连接并向其提供数据 根据这些问题,如果我的服务在我的应用程序进程中,在应用程序关闭时被杀死,这是一种正常的行为 但我甚至尝试在一个单独的进程中运行我的服务,在我的清单中使用这个标签android:process=“:service”,但当我的应用程序被终止时,它也会被终止并重新启动 更多信息: 我在应用程序onCreate方法中启动服务,在活动中绑定到我的服务时,我使用BIND\u AUTO\u CREA
android:process=“:service”
,但当我的应用程序被终止时,它也会被终止并重新启动
更多信息:
我在应用程序onCreate方法中启动服务,在活动中绑定到我的服务时,我使用BIND\u AUTO\u CREATE
,通常我不确定它是否正确
更新:
我还有另一个绑定在我当前服务中的服务,我不确定它是否是问题的根源
更多更新:
我正在使用dagger for DI,我是否可能错误地使用应用程序上下文在我的服务中创建一些对象!!这可能是这个问题的原因吗
更多更新
我为我的服务分离了dagger组件,现在应用程序和服务并没有公共对象,但问题仍然存在
使用出现相同问题的示例代码进行更新
下面是应用程序类:
class MyApplication:Application() {
override fun onCreate() {
super.onCreate()
startService(Intent(this, MyService::class.java))
}
}
以下是服务类别:
class MyService : Service() {
private val mBinder = MyBinder()
inner class MyBinder : Binder() {
internal val service: MyService
get() = this@MyService
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.i(TAG, "onStartCommand")
return START_STICKY
}
override fun onCreate() {
super.onCreate()
Log.i(TAG, "onCreate")
}
override fun onBind(intent: Intent): IBinder? {
Log.i(TAG, "onBind")
return mBinder
}
override fun onUnbind(intent: Intent): Boolean {
Log.i(TAG, "onUnbind")
return super.onUnbind(intent)
}
override fun onDestroy() {
Log.i(TAG, "onDestroy")
super.onDestroy()
}
companion object {
val TAG = "MyService"
}
}
这是一项活动:
class MainActivity : AppCompatActivity() {
lateinit var context: Context
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i(TAG, "onCreate")
context = this
}
//connect to the service
val myServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.i(TAG, "onServiceConnected")
val binder = service as? MyService.MyBinder
// ...
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.i(TAG, "onServiceDisconnected")
}
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume")
val intent = Intent(context, MyService::class.java)
bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE);
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause")
unbindService(myServiceConnection)
}
companion object {
val TAG = "MainActivity"
}
}
最后但并非最不重要的是,清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mirhoseini.stickyservice">
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"
android:process=":service" />
</application>
</manifest>
当应用程序主线程停止时,服务停止是一种正常行为 就我个人而言,我不同意在单独的过程中使用内部服务来进行模块之间的常规开发和功能共享。大多数情况下,工人或IntentService是更合适的候选人 要在用户退出应用程序后使服务保持活动状态,请尝试最适合您需要的定时线程机制之一: 1-TimerTask(不推荐使用!) 2-Executors.newScheduledThreadExecutor 3-警报管理器
4-JobScheduler在绑定之前启动服务-
解除绑定服务
文档说:“断开与应用程序服务的连接。当服务重新启动时,您将不再接收呼叫,并且现在允许服务随时停止。”@pskink我在绑定之前运行的应用程序类onCreate中启动服务,根据logcat,我可以看到我的服务onCreate在onBindService()之前运行很久,在unbindService()
call?@pskink是的,没错!发布您的代码,然后我想使用我的后台服务来保持蓝牙连接的活动和运行,这意味着它不是一个与时间相关的服务,可能会被中断或在不同时期运行。对我的情况有什么想法吗?IntentService看起来不错。它维护一个工作队列,自动启动服务,并在队列中有工作时使其保持活动状态。但当没有任务要做时,它将死亡。顺便说一下,我需要我的服务中的蓝牙连接对象来重用它!当然如果您的服务将轮询外部条件以触发其他模块,我想使用执行器或计时器任务进行定时轮询可能是解决方案。如果无法保持服务运行,您必须准备代码以重新启动并能够继续。我添加了我在研究和测试中发现的更多细节。