在Service中弹出一个窗体

在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"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EN。抱歉,我找不到地方上传它,暂时用用这个地方吧。压缩包中包含的文件: TSCC.exe : 解码器TechSmith Screen Capture Codec (TSCC). 如果要在其它播放工具中放演示的AVI,需要安装该解码器 CamPlay.exe : Camtasia 专用的播放器。用它播放,不需要先安装解器。1. 使用FCL/VCL下的组件设计与ASP.NET下的组件设计器的相似性对照--------ASP.NET.User.Control.DemoDEMO.aviUser.Control.DemoDEMO.avi--------在两种方式下设置组件的操作是大致相同的。在User.Control.Demo这个DEMO中,我特地做了两个错误的操作。第一个错误操作是在将UserControl.pas这个单元加入Package1中,便立即开始编译,这时会提示“File not Found : ‘System.Drawing.dcuii”,这是因为Delphi .NET缺省时不会添加对System.Windows.Forms/System.Data的引用。因此需要添加这些引用。随后Package1.dll将被编译通过。第二个错误操作是试图通过“Install VCL Package”来安装刚才的Package1.dll。这时会发现在窗体上添加User Control失败。这是因为该组件并没有添加成功。更具体的原因是因为Package1.dll没有在搜索路径上。因此,在主应用程序中添加对Package1.dll的引用后,控件可以向窗体上添加了。之所以留下这两个错误的操作,是因为我相信这是初次使用Delphi .NET的用户一定会遇到的。希望这个DEMO的现,能让大家入手快一些。^.^2. 使用Windows Forms作为Client开发Web Services应用 (这个DEMO在BorCon上成功完成,但我认为有再做一次的价值)--------ASP.NET.Web.Service.Demo--------这个DEMO展示了Client与Web Services交互的基本代码。Service使用的是Delphi.NET生成的框架中的缺省演示代码,它将返回一个“Hello World”字符串。同样的,Services中也可以返回xml描述的数据库等等,但基本代码结构是一样的。Client使用了ASP.NET和VCL Forms两种实现方式。我在BorCon上做的是WindowsForms,所以就不再做了。但代码是完全一样的。从DEMO上也可以看这一点。按下Button,你应该注意到Caption的变化。但是,重要的是:这个字符串是从Web上远程获取的,但是调用代码时与在本地一样!3. Delphi .NET版本的Web Browser开发(使用InterOp实现Win32代码调用)--------ActiveX.Web.Browser.DemoDEMO.avi--------有想到过InterOp原来是这么简单的吗?看看.NET Framework中关于它的文档,你会哭的。但是,Delphi .NET中……太简单了!
在Java中,可以通过在一个窗体类中创建另一个窗体对象并将其设置为可见来在另一个窗体中调用窗体。你可以在当前窗体中的某个事件处理器中实现这个功能,比如在一个按钮的单击事件处理器中。 下面是一个简单的示例代码,演示如何在一个窗体中调用另一个窗体: ```java import javax.swing.*; public class MainFrame extends JFrame { public MainFrame() { // 设置窗体大小和标题 setSize(400, 300); setTitle("主窗体"); // 创建一个按钮 JButton btnOpen = new JButton("打开子窗体"); // 添加按钮的单击事件处理器 btnOpen.addActionListener(e -> { // 创建一个新的子窗体 ChildFrame childFrame = new ChildFrame(this); // 将子窗体设置为可见 childFrame.setVisible(true); }); // 将按钮添加到窗体中 add(btnOpen); // 设置窗体布局为流式布局 setLayout(new FlowLayout()); // 设置窗体关闭时的默认操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { // 创建主窗体对象 MainFrame mainFrame = new MainFrame(); // 将主窗体设置为可见 mainFrame.setVisible(true); } } class ChildFrame extends JFrame { public ChildFrame(JFrame parent) { // 设置窗体大小和标题 setSize(200, 150); setTitle("子窗体"); // 设置窗体关闭时的默认操作 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 设置子窗体相对于父窗体的位置 setLocationRelativeTo(parent); } } ``` 在这个示例中,我们创建了一个名为MainFrame的JFrame对象,并添加了一个名为“打开子窗体”的JButton。当用户单击这个按钮时,我们创建了一个名为ChildFrame的新JFrame对象,并将其设置为可见。 注意,我们在ChildFrame的构造函数中增加了一个JFrame类型的参数parent,用于传递父窗体对象。我们在子窗体中调用了JFrame的setLocationRelativeTo()方法,将子窗体相对于父窗体居中显示。 当然,这只是示例代码,实际中还需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值