在Service中弹出一个窗体

本文介绍了如何在Android应用中,通过按钮点击来启动服务,并在服务内部监听返回键实现窗口的关闭。文章详细阐述了布局文件、活动类和服务类的实现方式,包括权限申请、服务创建、参数设置、视图添加以及返回键事件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在MainActivity中,点击按钮,开启service

activity_main.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="360dp">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_centerInParent="true"
        android:layout_height="match_parent"
        android:text="startservice" />
</RelativeLayout>

在MainActcivity中

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,MyService.class);

                startService(intent);

                finish();
            }
        });
    }

}

在MyService中


public class MyService extends Service {

    private WindowManager windowManager;
    private WindowManager.LayoutParams params;
    private View view;
    private Button btn;
    private boolean isViewGroup;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {

        setParmas();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

         isViewGroup = true;

        if (isViewGroup) {
            view = View.inflate(this, R.layout.activity_main, null);
            btn = (Button) view.findViewById(R.id.btn);
            windowManager.addView(view, params);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("service", "setOnClickListener");
                    windowManager.removeView(view);
                }
            });

            //点击返回键,退出窗体,但是此方法不执行,不知道为什么?希望有大神看到能回一个
//        view.setOnKeyListener(new View.OnKeyListener() {
//            @Override
//            public boolean onKey(View v, int keyCode, KeyEvent event) {
//                if (keyCode == KeyEvent.KEYCODE_BACK) {
//                    windowManager.removeView(view);
//                }
//                Log.e("setOnKeyListener", "setOnKeyListener");
//                return true;
//            }
//        });
        }else {

            final View v = new View(this);
            v.setBackgroundResource(R.mipmap.ic_launcher);

            windowManager.addView(v, params);
            //点击返回键,可以退出窗体
            v.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        windowManager.removeView(t);
                        Log.e("setOnKeyListener", "setOnKeyListener---------");
                    }
                    return true;
                }
            });
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void setParmas() {
        windowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);

        params = new WindowManager.LayoutParams();
        params.format = PixelFormat.RGBA_8888;
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
        params.gravity = Gravity.CENTER;
        params.width = 300;
        params.height = 300;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值