Service 使用 WindowManager addView
首先写一个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以及设置如下权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
<service android:name=".MyService" />
</application>
</manifest>
当然,还是可能会出现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操作。
下一篇:
List集合的五种遍历方式
