Java 应用程序终止时调用浮动窗口时发生崩溃

Java 应用程序终止时调用浮动窗口时发生崩溃,java,android,android-service,android-windowmanager,Java,Android,Android Service,Android Windowmanager,当发生服务报警或呼叫时,我想在屏幕顶部显示浮动布局。通常,当应用程序打开或在后台(在刷出之前)时,它会显示并运行良好。即使我关闭了应用程序,它仍然会显示(kill=滑动应用程序),并且它仍在工作。但是,如果应用程序被杀死而没有打开,它会尝试显示(例如,从报警服务)它崩溃了,我甚至无法在终止应用程序后在android studio中看到崩溃日志。 我如何解决这个问题或找到问题 我的代码报警广播在它调用的地方:(根据需要调用报警广播) 我的浮动视图代码: import android.annotat

当发生服务报警或呼叫时,我想在屏幕顶部显示浮动布局。通常,当应用程序打开或在后台(在刷出之前)时,它会显示并运行良好。即使我关闭了应用程序,它仍然会显示(kill=滑动应用程序),并且它仍在工作。但是,如果应用程序被杀死而没有打开,它会尝试显示(例如,从报警服务)它崩溃了,我甚至无法在终止应用程序后在android studio中看到崩溃日志。 我如何解决这个问题或找到问题

我的代码报警广播在它调用的地方:(根据需要调用报警广播)

我的浮动视图代码:

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.greenbook.greenlids.MainActivity;
import com.example.greenbook.greenlids.R;

public class FloatingWindow extends Service {

    private WindowManager windowManager;
    private LinearLayout layout;
    private TextView txt;
    private Button bttn1 , exitBttn;
    private Context context;

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

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onCreate() {
        super.onCreate();


        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);


        layout = new LinearLayout(this);

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        layout.setBackgroundColor(Color.argb(255,0,0,255));


        layout.setLayoutParams(layoutParams);
        final WindowManager.LayoutParams windowParams;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

             windowParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
            windowParams.x = 0;
            windowParams.y = 0;
            windowParams.gravity = Gravity.CENTER;

        }else{
            windowParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
            windowParams.x = 0;
            windowParams.y = 0;
            windowParams.gravity = Gravity.CENTER;
        }

        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

        if (layoutInflater != null) {
            layout = (LinearLayout) layoutInflater.inflate(R.layout.linear_layout_floating_window, null);
        }
        layout.setBackgroundColor(Color.argb(255,240,240,255));

        bttn1 = layout.findViewById(R.id.LLbutton);
        exitBttn = layout.findViewById(R.id.exitBttn);
        txt = layout.findViewById(R.id.noteTxt);
        txt.setTextSize(18);
        txt.setText("Natan");
        exitBttn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                windowManager.removeView(layout);
                stopSelf();
            }
        });
        bttn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                boolean handler = new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        txt.setText("Natan The King");
                    }
                }, 1000*5);
            }
        });

        windowManager.addView(layout,windowParams);


        layout.setOnTouchListener(new View.OnTouchListener() {

            private WindowManager.LayoutParams updateParam = windowParams;
            int x , y;
            float touchedX , touchedY;




            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:

                        x = updateParam.x;
                        y = updateParam.y;

                        touchedX = event.getRawX();
                        touchedY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:

                    updateParam.x = (int) (x+event.getRawX() - touchedX);
                    updateParam.y = (int) (y+event.getRawY() - touchedY);

                    windowManager.updateViewLayout(layout,updateParam);
                    break;
                }
                return false;
            }
        });
    } 
}

在某些情况下,后台应用程序会被放置在临时白名单上几分钟。当应用程序在白名单上时,它可以不受限制地启动服务,并且允许运行其后台服务。当应用程序处理用户可见的任务时,会将其置于白名单上,例如:

处理高优先级Firebase云消息(FCM)消息。 接收广播,如SMS/MMS消息。 从通知执行挂起事件。 在VPN应用程序升级到前台之前启动VPN服务。 摘自下面的链接 我在这里找到了答案:

附加日志在终止应用程序后,我在android studio stopsAndroid studio中没有获取日志,Roid studio不会停止,您肯定会获取日志,粘贴日志中的任何内容,感谢我学会了使用logcat并找到了解决方案
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.greenbook.greenlids.MainActivity;
import com.example.greenbook.greenlids.R;

public class FloatingWindow extends Service {

    private WindowManager windowManager;
    private LinearLayout layout;
    private TextView txt;
    private Button bttn1 , exitBttn;
    private Context context;

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

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onCreate() {
        super.onCreate();


        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);


        layout = new LinearLayout(this);

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        layout.setBackgroundColor(Color.argb(255,0,0,255));


        layout.setLayoutParams(layoutParams);
        final WindowManager.LayoutParams windowParams;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

             windowParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
            windowParams.x = 0;
            windowParams.y = 0;
            windowParams.gravity = Gravity.CENTER;

        }else{
            windowParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
            windowParams.x = 0;
            windowParams.y = 0;
            windowParams.gravity = Gravity.CENTER;
        }

        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

        if (layoutInflater != null) {
            layout = (LinearLayout) layoutInflater.inflate(R.layout.linear_layout_floating_window, null);
        }
        layout.setBackgroundColor(Color.argb(255,240,240,255));

        bttn1 = layout.findViewById(R.id.LLbutton);
        exitBttn = layout.findViewById(R.id.exitBttn);
        txt = layout.findViewById(R.id.noteTxt);
        txt.setTextSize(18);
        txt.setText("Natan");
        exitBttn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                windowManager.removeView(layout);
                stopSelf();
            }
        });
        bttn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                boolean handler = new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        txt.setText("Natan The King");
                    }
                }, 1000*5);
            }
        });

        windowManager.addView(layout,windowParams);


        layout.setOnTouchListener(new View.OnTouchListener() {

            private WindowManager.LayoutParams updateParam = windowParams;
            int x , y;
            float touchedX , touchedY;




            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:

                        x = updateParam.x;
                        y = updateParam.y;

                        touchedX = event.getRawX();
                        touchedY = event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:

                    updateParam.x = (int) (x+event.getRawX() - touchedX);
                    updateParam.y = (int) (y+event.getRawY() - touchedY);

                    windowManager.updateViewLayout(layout,updateParam);
                    break;
                }
                return false;
            }
        });
    } 
}
 06-18 11:59:00.263 6722-6722/? E/Zygote: isWhitelistProcess - Process is Whitelisted
06-18 11:59:00.264 6722-6722/? E/libpersona: scanKnoxPersonas
    Couldn't open the File - /data/system/users/0/personalist.xml - No such file or directory
06-18 11:59:00.268 6722-6722/? W/SELinux: SELinux selinux_android_compute_policy_index : Policy Index[2],  Con:u:r:zygote:s0 RAM:SEPF_SM-G935F_8.0.0_0007, [-1 -1 -1 -1 0 1]
06-18 11:59:00.269 6722-6722/? I/SELinux: SELinux: seapp_context_lookup: seinfo=untrusted, level=s0:c512,c768, pkgname=com.example.greenbook.greenlids 
06-18 11:59:00.275 6722-6722/? I/zygote64: Late-enabling -Xcheck:jni
06-18 11:59:00.341 6722-6722/? D/TimaKeyStoreProvider: TimaKeyStore is not enabled: cannot add TimaSignature Service and generateKeyPair Service
06-18 11:59:00.341 6722-6722/? D/ActivityThread: Added TimaKeyStore provider
06-18 11:59:00.422 6722-6722/com.example.greenbook.greenlids I/zygote64: no shared libraies, dex_files: 1
06-18 11:59:00.723 6722-6722/com.example.greenbook.greenlids I/InstantRun: starting instant run server: is main process
06-18 11:59:00.750 6722-6722/com.example.greenbook.greenlids D/AndroidRuntime: Shutting down VM


    --------- beginning of crash
06-18 11:59:00.755 6722-6722/com.example.greenbook.greenlids E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.greenbook.greenlids, PID: 6722
    java.lang.RuntimeException: Unable to start receiver com.example.greenbook.greenlids.models.BroadcastManager: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.greenbook.greenlids/.floating_window.FloatingWindow }: app is in background uid UidRecord{1651455 u0a451 RCVR idle procs:1 seq(0,0,0)}
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3399)
        at android.app.ActivityThread.-wrap18(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1780)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.greenbook.greenlids/.floating_window.FloatingWindow }: app is in background uid UidRecord{1651455 u0a451 RCVR idle procs:1 seq(0,0,0)}
        at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1538)
        at android.app.ContextImpl.startService(ContextImpl.java:1484)
        at android.content.ContextWrapper.startService(ContextWrapper.java:663)
        at android.content.ContextWrapper.startService(ContextWrapper.java:663)
        at com.example.greenbook.greenlids.models.BroadcastManager.onReceive(BroadcastManager.java:40)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3392)
        at android.app.ActivityThread.-wrap18(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1780) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6944) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)