首先写一个Activity启动Service(我这里用的是startService())
设定一个点击事件去启动Service.
public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); Intent intent = new Intent(this, MyService.class); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startService(intent); Toast.makeText(MainActivity.this, "wobeidianjile", Toast.LENGTH_SHORT).show(); } }); } }
之后再进行Service编写
LayoutParams.type一定要设定为WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;不然会报错,当前没有Activity再运行。
public class MyService extends Service { private WindowManager mWindowManager; private WindowManager.LayoutParams mLayoutParams; private View mLayoutView; @Nullable @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); init(); addView(); } private void init() { mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); mLayoutParams = new WindowManager.LayoutParams(); mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; mLayoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_BLUR_BEHIND //设置外部模糊 mLayoutParams.format = PixelFormat.TRANSLUCENT; //不设置这个弹出框的透明遮罩显示为黑色 mLayoutParams.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;//隐藏导航栏 mLayoutView = View.inflate(this, R.layout.privacy_file, null); } private void addView() { mWindowManager.addView(mLayoutView, mLayoutParams); } }
进行Manifest编写,Manifest引入Service以及设置如下权限
当然,还是可能会出现TYPE_APPLICATION_OVERLAY 2038错误
原因:需要手动开启权限,代码如下会弹出一个权限设置(startActivityForResult是必须在Activity来做的,可以先写个Activity进行设置权限之后再进行删除)
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 100);
宗上,就完成了简单的Service 通过WindowManager进行addView操作。