Android layout 在服务内部重复操作

Android layout 在服务内部重复操作,android-layout,android-intent,android-inflate,Android Layout,Android Intent,Android Inflate,从MainActivity我将意向传递给startService。该服务已成功启动 在该服务上,有一个小矩形文本(“hello,world”),它最初是在XML布局中初始化的。在下面复制的服务代码中,我首先将textView01文本改为表示日期和时间的字符串。这也是成功的(即,当服务启动时,用户从不会在屏幕上看到“hello,world”,只有日期和时间字符串) 在下面的代码中,我更新了延迟3秒的日期和时间。成功(我正在屏幕上实时查看字符串更改) 我的问题是:我无法让它不断重复更新。我试过

从MainActivity我将意向传递给startService。该服务已成功启动

  • 在该服务上,有一个小矩形文本(“hello,world”),它最初是在XML布局中初始化的。在下面复制的服务代码中,我首先将textView01文本改为表示日期和时间的字符串。这也是成功的(即,当服务启动时,用户从不会在屏幕上看到“hello,world”,只有日期和时间字符串)

  • 在下面的代码中,我更新了延迟3秒的日期和时间。成功(我正在屏幕上实时查看字符串更改)

  • 我的问题是:我无法让它不断重复更新。我试过了每一个循环,延迟,等待,睡眠,还有我研究过的所有我能想到的东西,都没有用。它当前只是在更新后停止——一次——3秒后

    谢谢你能提供的任何帮助

    package com.example.myapplication;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.graphics.PixelFormat;
    import android.view.LayoutInflater;
    import android.view.WindowManager;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.TextView;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import android.os.Handler;
    
    public class FloatingWidgetShowService extends Service{
        WindowManager windowManager;
        View floatingView, collapsedView, expandedView;
        WindowManager.LayoutParams params ;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            floatingView = LayoutInflater.from(this).inflate(R.layout.floating_widget_layout, null);
            TextView innerView = floatingView.findViewById(R.id.textView01);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
    
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_TOAST,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);
    
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            windowManager.addView(floatingView, params);
            expandedView = floatingView.findViewById(R.id.Layout_Expended);
            collapsedView = floatingView.findViewById(R.id.Layout_Collapsed);
            floatingView.findViewById(R.id.Widget_Close_Icon).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            stopSelf();
                        }
            });
    
            String currentDateandTime = sdf.format(new Date());
            innerView.setText(currentDateandTime);
    
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    String currentDateandTime = sdf.format(new Date());
                    innerView.setText(currentDateandTime);
                }
            }, 3000);
    
            expandedView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        collapsedView.setVisibility(View.VISIBLE);
                        expandedView.setVisibility(View.GONE);
                    }
            });
    
            floatingView.findViewById(R.id.MainParentRelativeLayout).setOnTouchListener(new View.OnTouchListener() {
                int X_Axis, Y_Axis;
                float TouchX, TouchY;
    
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            X_Axis = params.x;
                            Y_Axis = params.y;
                            TouchX = event.getRawX();
                            TouchY = event.getRawY();
                            return true;
                        case MotionEvent.ACTION_UP:
                            collapsedView.setVisibility(View.GONE);
                            expandedView.setVisibility(View.VISIBLE);
                            return true;
                        case MotionEvent.ACTION_MOVE:
                            params.x = X_Axis + (int) (event.getRawX() - TouchX);
                            params.y = Y_Axis + (int) (event.getRawY() - TouchY);
                            windowManager.updateViewLayout(floatingView, params);
                            return true;
                    }
                    return false;
                }
            });
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (floatingView != null) windowManager.removeView(floatingView);
        }
    }
    

    只需将更新重新发布到
    处理程序
    ,如下所示:

    handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                String currentDateandTime = sdf.format(new Date());
                innerView.setText(currentDateandTime);
                // Now post the update to run again in 3 seconds
                handler.postDelayed(this, 3000);
            }
        }, 3000);