我通过传递值来调用我的服务类,我想要在屏幕上显示这些文本(需要屏幕上的drow权限),即使应用程序关闭了。然而,当应用程序存活时,它仍然有效,但当我关闭应用程序时,onStartCommand(intent: Intent?, flags: Int, startId: Int)
方法再次运行,并返回一个空的intent值,这就是我正在丢失从intent获得的数据的问题。当onStartCommand第一次在活跃的应用程序上运行时,我尝试在sharedPreference中传递这些值,如果应用程序关闭,我将无法从sharedPreference获取数据。如何在后台服务中从room database
、sharedPreference
或intent
获取数据,哪种是最佳实践?
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")
}
} ```
发布于 2019-04-09 03:49:59
当你在Android 8.0和更高版本上运行你的应用程序时,你的服务可能会被终止,
您可以尝试在前台运行您的服务,如果它满足条件(非常有用,并显示通知),因此它不应该被终止。
您可以在此处阅读有关将服务作为前台服务启动的更多信息:
https://developer.android.com/guide/components/services#Foreground
或者,如果您保留您的服务实现(不推荐),您可以尝试在onStartCommand()中返回Service.START_REDELIVER_INTENT,这将重新传递原始意图
https://stackoverflow.com/questions/55580444
复制相似问题