当应用程序被杀死或关闭时,我如何保持后台 android 服务运行

贾瓦德·法德尔

大家好,
我有新闻应用程序,我想在每次更新时推送通知。
我使用 socketIO 从服务器进行监听,我的 Android 服务问题我想在关闭时保持服务运行 | 被杀。我在应用程序运行时启动了我的服务,当应用程序关闭时,我在 onStartCommand START_STICKY_COMPATIBILITY 中返回它的工作正常,但是服务被操作系统杀死但没有再次启动有什么帮助吗?

注意:我忽略了应用程序的电池优化

我的服务类:

class ServicesMain: Service() {
    override fun onBind(p0: Intent?): IBinder? {
       return  null;
    }
    @SuppressLint("TrulyRandom")
    fun handleSSLHandshake() {
        try {
            val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
                override fun getAcceptedIssuers(): Array<X509Certificate>? {
                    return null;
                }

                override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {}
                override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {}
            })
            val sc = SSLContext.getInstance("SSL")
            sc.init(null, trustAllCerts, SecureRandom())
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)
            HttpsURLConnection.setDefaultHostnameVerifier { arg0, arg1 -> true }
        } catch (ignored: Exception) {
        }
    }
@RequiresApi(Build.VERSION_CODES.O)
fun  startSocket(){
    handleSSLHandshake()
    runBroadcast()
    Log.d("TAG", "BroadcastReceiver: ")
    Timer().schedule(object : TimerTask() {
        override fun run() {
            Log.d("TAG", "run: ${socket!!.connected()} ")

        }

    }, 0, 10000)



}
    private var socket: Socket? = null;

    @SuppressLint("RestrictedApi")
    @RequiresApi(Build.VERSION_CODES.O)
    fun runBroadcast() {
        val myHostnameVerifier = HostnameVerifier { _, _ ->
            return@HostnameVerifier true
        }

        val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
            override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}

            override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}

            override fun getAcceptedIssuers(): Array<X509Certificate> {
                return arrayOf()
            }
        })

        val sslContext = SSLContext.getInstance("TLS")
        sslContext.init(null, trustAllCerts, null)

        val okHttpClient = OkHttpClient.Builder()
                .hostnameVerifier(myHostnameVerifier)
                .sslSocketFactory(sslContext.socketFactory, trustAllCerts[0] as X509TrustManager)
                .readTimeout(0, TimeUnit.MILLISECONDS).writeTimeout(0, TimeUnit.MILLISECONDS).build()

        val options = IO.Options()
        options.transports = arrayOf(Polling.NAME)
        options.webSocketFactory = okHttpClient
        options.callFactory=okHttpClient
        options.secure = true
        socket = IO.socket("https://....", options);

        socket!!.connect().on("message", Emitter.Listener { args ->


            val jsonObject = JSONObject(args[0] as String)

            val calendarTime = jsonObject.getLong("starttime") - (Calendar.getInstance().timeInMillis)

            println(calendarTime)

            val builder = Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
            val data: Data.Builder = Data.Builder()
            data.putStringArray("data", arrayOf<String>(jsonObject.getString("title"), jsonObject.getString("subject"), jsonObject.getString("id")))


            val oneTimeWorkRequest = OneTimeWorkRequest.Builder(NotificationEvetns::class.java).setInputData(data.build()).setConstraints(builder.build())
                    .setInitialDelay(calendarTime, TimeUnit.MILLISECONDS).addTag(jsonObject.getString("id")).build()
            this.let { WorkManager.getInstance(it).enqueue(oneTimeWorkRequest) }
        })


}

    override fun onTaskRemoved(rootIntent: Intent?) {

        super.onTaskRemoved(rootIntent)
        Log.d("TAG", "onTaskRemoved: ")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d("TAG", "onStartCommand: ")

        return  START_STICKY_COMPATIBILITY
    }




    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate() {
        super.onCreate()

        startSocket()
    }


    override fun onDestroy() {
        super.onDestroy()
        socket?.disconnect()
    }

    override fun onTrimMemory(level: Int) {
        super.onTrimMemory(level)
        Log.d("TAG", "onTrimMemory: ")
    }

}

加布·塞尚

你不能,不能在现代版本的 Android 上。您可以创建一个最不可能被杀死的前台服务(在前台应用程序之外),但您不能指望它不会被杀死。而是编写您的代码,以便它不需要 - 主要是通过使用 WorkManager 来触发后台工作。除非您正在编写服务器,在这种情况下我会说您应该使用其他操作系统,否则 Android 不适合。

对于来自您提到的服务器的消息,我会使用 FCM 推送消息而不是长期存在的直接服务器连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当应用程序被破坏或进入后台的Android位置服务停止工作

当应用程序被杀死/在后台运行时,检测Android 7及更高版本中的连接更改

当应用程序进入后台时,Android 11(API级别30)onTaskRemoved在前景服务中触发

当应用从Android上的任务管理器中被杀死时,代码将在哪里停止运行

解析CorodvaPush Ionic:当应用程序在后台运行时,Android不显示通知

当应用程序在后台运行时,Android服务会接收短信

根据业务需求,我必须始终在我的android应用程序中保持后台服务运行

当我滑出我的应用程序(在其他进程中运行)时,在单独进程上运行的Android Service被杀死

当应用程序后台运行时线程被杀死?

Android-当应用程序在后台运行时,Recycler视图会调整大小

当应用程序被杀死时,Android警报管理器无法正常工作

当应用程序被杀死时,FireBase仅在以下Android 6.0设备中不接收推送通知

应用程序在android中被杀死后后台服务无法正常工作

应用被杀死时,Android FCM部分运行

在Android中杀死在后台运行的应用程序

Android:Android服务强制应用程序运行缓慢

Android DroidGap服务保持应用程序运行

Android服务未在我的应用程序中运行

android如何在启动时在后台运行我的应用程序

如何从在后台运行的我的服务中知道运行状况最好的应用程序的程序包名称(android)

当应用程序被杀死时,android广播接收器不监听

在 Android 中不断运行 JobService-甚至应用程序被杀死

当我点击运行应用程序时,android 服务消失了,当应用程序崩溃时也是如此

如何在应用程序被杀死而不在 IOS 后台运行时获取通知负载

如何让 Android 应用程序只运行后台服务,而不能启动?

当应用程序被系统杀死/重新启动时,Android 服务崩溃

当应用程序被杀死时,如何最好地清除 Android ViewModel?

Android WorkManager 能否在待机模式下运行或应用程序被杀死

即使应用程序关闭,Android 应用程序也会通过在后台检查服务器(排球)中运行的服务显示通知