应用关闭时,服务会被杀死

时间:2017-07-21 09:12:43

标签: java android process android-service kotlin

我有一个主要服务应该始终在Android应用程序的后台运行,以处理蓝牙设备连接并向其提供数据。

根据这些问题,如果我的服务生活在我的应用程序流程中,以便在应用程序关闭时被杀,这是正常的行为,

但我甚至尝试在我的清单中使用此标记android:process=":service"在一个单独的进程中运行我的服务,但是当我的应用程序被杀死时它也会被杀死并重新启动!

更多信息: 我在我的应用程序onCreate方法中启动我的服务,并且为了在我的活动中绑定到我的服务,我使用BIND_AUTO_CREATE,这通常我不确定它是否正确。

更新 我还有另一个服务绑定在我当前的服务中,我不确定它是否可能是问题的来源!

更新更新 我使用dagger进行DI,是否可能错误地使用应用程序上下文在我的服务中创建一些对象!!这可能是导致这个问题的原因吗?

更多更新 我为我的服务分离了匕首组件,现在应用程序和服务没有共同的对象,但问题仍然存在。

使用获得相同问题的示例代码进行更新 这是Application类:

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>

1 个答案:

答案 0 :(得分:0)

当应用程序主线程停止时,服务停止是正常行为。

就我个人而言,我不同意在单独的流程中使用内部服务来进行模块之间的常规开发和功能共享。在大多数情况下,工作者或IntentService是更合适的候选者。

要在用户退出应用后让您的服务保持活跃,请尝试其中一种最适合您需求的预定线程机制:

1- TimerTask(不是真的推荐!)

2- Executors.newScheduledThreadExecutor

3- AlarmManager

4- JobScheduler