从Android服务中启动一个系统PopupWindow

613 阅读1分钟

从Android服务中启动一个系统弹层

  • 申请系统弹窗权限
  • 显示弹层
    • 增加一个服务
    • 增加服务配置到xml文件中
    • 获取一个WindowManager服务
      • 增加系统弹窗的type

申请系统弹窗权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

在AndroidManifest.xml中申请需要系统弹窗权限

显示系统弹层

增加一个服务


class MyService : Service() {
    private var mView: View? = null
    private var mParams: WindowManager.LayoutParams? = null
    private var mWindowManager: WindowManager? = null
    override fun onCreate() {
        super.onCreate()
        mView = MyLoadView(this)
        mParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, 150, 10, 10,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT
        )

        mParams!!.gravity = Gravity.CENTER
        mParams!!.title = "Window test"
        mWindowManager = getSystemService(WINDOW_SERVICE) as WindowManager?
        mWindowManager!!.addView(mView, mParams)
    }

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

    override fun onDestroy() {
        super.onDestroy()
        (getSystemService(WINDOW_SERVICE) as WindowManager?)!!.removeView(mView)
        mView = null
    }

    inner class MyLoadView(context: Context?) : View(context) {
        private val mPaint: Paint = Paint()

        init {
            mPaint.textSize = 50.0f
            mPaint.setARGB(200, 200, 200, 200)
        }

        override fun onDraw(canvas: Canvas) {
            super.onDraw(canvas)
            canvas.drawText("test test test", 0f, 100f, mPaint)
        }

        override fun onAttachedToWindow() {
            super.onAttachedToWindow()
        }

        override fun onDetachedFromWindow() {
            super.onDetachedFromWindow()
        }

        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        }
    }
}

配置服务到AndroidManifest.xml中

<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="true"
    android:label="@string/accessibilityName">

</service>

启动服务

val intent = Intent(context, MyService::class.java)
if (intent != null && isPopupPermission(context)) {
    context.startService(intent)
}

检查是否有启动权限.没有启动权限转到权限申请列表

fun isPopupPermission(context: Context): Boolean {
    return Settings.canDrawOverlays(context)
}

fun checkPopupPermission(context: Context) {
    if (!Settings.canDrawOverlays(context)) {
        val intent_dol =
            Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()))
        intent_dol.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        val resolveInfo: ResolveInfo? =
            context.getPackageManager().resolveActivity(intent_dol, PackageManager.MATCH_ALL)
        if (resolveInfo != null) {
            context.startActivity(intent_dol)
        } else {
            val intent =
                Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + context.getPackageName()))
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            context.startActivity(intent)
        }
        Toast.makeText(context, "请授予应用悬浮窗权限,并设置允许后台运行", Toast.LENGTH_SHORT).show()
    }
}

问题

  • 没有权限,不会弹出弹层
  • 不设置type,也不会显示弹层
  • 没在xml配置服务,启动不了服务