从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配置服务,启动不了服务