首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无论是从房间数据库还是从android后台服务的活动意图中获取数据,如何保持一致

无论是从房间数据库还是从android后台服务的活动意图中获取数据,如何保持一致
EN

Stack Overflow用户
提问于 2019-04-09 03:24:00
回答 1查看 40关注 0票数 0

我通过传递值来调用我的服务类,我想要在屏幕上显示这些文本(需要屏幕上的drow权限),即使应用程序关闭了。然而,当应用程序存活时,它仍然有效,但当我关闭应用程序时,onStartCommand(intent: Intent?, flags: Int, startId: Int)方法再次运行,并返回一个空的intent值,这就是我正在丢失从intent获得的数据的问题。当onStartCommand第一次在活跃的应用程序上运行时,我尝试在sharedPreference中传递这些值,如果应用程序关闭,我将无法从sharedPreference获取数据。如何在后台服务中从room databasesharedPreferenceintent获取数据,哪种是最佳实践?

class PopupService: Service() {
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

//Initializing value 
    var interval:Long = 500
    val mTimer = Timer()
    lateinit var pref: SharedPreferences
    lateinit var wm:WindowManager
    lateinit var textView:TextView
    lateinit var data:ArrayList<String>


    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        Log.d("MyNameisNotName","Started")

        //I am getting arrayList and storing to data. 
        if(intent!= null)
        data = intent.getStringArrayListExtra("messages")

      //Initializing values to popup texts on screen
        wm = this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val inflater: LayoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        textView = inflater.inflate(R.layout.messages, null) as TextView
        val data = App.getDb
        mTimer.scheduleAtFixedRate(TimeDisplayTimerTask(wm,textView,data), 0, interval)

        return super.onStartCommand(intent, flags, startId)
    }


//Function to handle action periodiaclly in given duration
    class TimeDisplayTimerTask(val wm: WindowManager,val textView: TextView,val db:AppDb) : TimerTask() {

        var params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
            else
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT)


        val handler = Handler()

        fun textDecoration(textView: TextView,data:List<Memo>) {
            try {
                textView.text = data[Random.nextInt(data.size-1)].text
                textView.textSize = 45f
                textView.setBackgroundColor(Color.WHITE)
                textView.setTextColor(Color.BLUE)
                textView.setPadding(10, 10, 10, 10)
            }catch (e:Exception){

            }
        }

        override fun run() {

         val myRun = Runnable{
                val displaymetrics = DisplayMetrics()

                wm.defaultDisplay.getMetrics(displaymetrics)
                val width = displaymetrics.widthPixels
                val height = displaymetrics.heightPixels

                params.x = Random.nextInt(width - 10)
                params.y = Random.nextInt(height - 10)
                var data = db.getMemoDao.getAll().value

                    Log.d("MyNameisNotName","Hi there"+data?.size.toString())
                    if(data!=null)
                textDecoration(textView,data)


                if (textView.isShown)
                    wm.removeView(textView)

                wm.addView(textView, params)
            }

                handler.post(myRun)
        }

        override fun cancel(): Boolean {
            if(textView.isShown)
                wm.removeView(textView)
            return super.cancel()
        }

    }



    override fun onDestroy() {
        super.onDestroy()
        if(textView.isShown)
            wm.removeView(textView)
        try{
            mTimer.cancel()
        }catch (e:Exception){

        }
        Log.d("MyNameisNotName","Destroyed")

    }
} ```
EN

回答 1

Stack Overflow用户

发布于 2019-04-09 03:49:59

当你在Android 8.0和更高版本上运行你的应用程序时,你的服务可能会被终止,

您可以尝试在前台运行您的服务,如果它满足条件(非常有用,并显示通知),因此它不应该被终止。

您可以在此处阅读有关将服务作为前台服务启动的更多信息:

https://developer.android.com/guide/components/services#Foreground

或者,如果您保留您的服务实现(不推荐),您可以尝试在onStartCommand()中返回Service.START_REDELIVER_INTENT,这将重新传递原始意图

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55580444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档