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操作。

经验分享 程序员 微信小程序 职场和发展