Android服务在不调用stopService()或stopSelf的情况下自动停止并自动停止

时间:2017-05-10 20:51:41

标签: android

我花了2个小时,  我无法弄清楚服务中的问题。我没有从其他任何地方调用stopService()或stopSelf。以下是代码,

public class FloatingViewService extends Service {

private WindowManager mWindowManager;
private View mFloatingView;


 WindowManager.LayoutParams params,landscapeParams,nonTouchableParams;

public FloatingViewService() {
}

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

@Override
public void onCreate() {
    super.onCreate();
    //Inflate the floating view layout we created
    mFloatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);

    //Add the view to the window.
    params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    //Specify the view position
    params.gravity = Gravity.TOP | Gravity.LEFT;        //Initially view will be added to top-left corner
    params.x = 0;
    params.y = 100;



    //Add the view to the window.
    landscapeParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    //Specify the view position
    landscapeParams.gravity = Gravity.TOP | Gravity.LEFT;        //Initially view will be added to top-left corner
    landscapeParams.x = 0;
    landscapeParams.y = 100;

    //Add the view to the window.
    nonTouchableParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT);

    //Specify the view position
    nonTouchableParams.gravity = Gravity.TOP | Gravity.LEFT;        //Initially view will be added to top-left corner
    nonTouchableParams.x = 0;
    nonTouchableParams.y = 100;

    //Add the view to the window
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    mWindowManager.addView(mFloatingView, params);

    //The root element of the collapsed view layout
    final View collapsedView = mFloatingView.findViewById(R.id.collapse_view);
    //The root element of the expanded view layout
    final View expandedView = mFloatingView.findViewById(R.id.expanded_container);


    //Set the close button
    ImageView closeButtonCollapsed = (ImageView) mFloatingView.findViewById(R.id.close_btn);
    closeButtonCollapsed.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //close the service and remove the from from the window
            stopSelf();
        }
    });


    //Set the close button
    ImageView closeButton = (ImageView) mFloatingView.findViewById(R.id.close_button);
    closeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            collapsedView.setVisibility(View.VISIBLE);
            expandedView.setVisibility(View.GONE);

        }
    });

    //Set the close button
    ImageView lock = (ImageView) mFloatingView.findViewById(R.id.lock_button);
    lock.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mWindowManager.updateViewLayout(mFloatingView, nonTouchableParams);

        }
    });

    //Set the close button
    ImageView expand = (ImageView) mFloatingView.findViewById(R.id.expand);
    expand.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mWindowManager.updateViewLayout(mFloatingView, landscapeParams);

        }
    });



    //Drag and move floating view using user's touch action.
    mFloatingView.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    //remember the initial position.
                    initialX = params.x;
                    initialY = params.y;

                    //get the touch location
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;
                case MotionEvent.ACTION_UP:
                    int Xdiff = (int) (event.getRawX() - initialTouchX);
                    int Ydiff = (int) (event.getRawY() - initialTouchY);

                    //The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little while clicking.
                    //So that is click event.
                    if (Xdiff < 10 && Ydiff < 10) {
                        if (isViewCollapsed()) {
                            //When user clicks on the image view of the collapsed layout,
                            //visibility of the collapsed layout will be changed to "View.GONE"
                            //and expanded view will become visible.
                            collapsedView.setVisibility(View.GONE);
                            expandedView.setVisibility(View.VISIBLE);
                        }
                    }
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //Calculate the X and Y coordinates of the view.
                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);

                    //Update the layout with new X & Y coordinate
                    mWindowManager.updateViewLayout(mFloatingView, params);
                    return true;
            }
            return false;
        }
    });
}

/**
 * Detect if the floating view is collapsed or expanded.
 *
 * @return true if the floating view is collapsed.
 */
private boolean isViewCollapsed() {
    return mFloatingView == null || mFloatingView.findViewById(R.id.collapse_view).getVisibility() == View.VISIBLE;
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mFloatingView != null) mWindowManager.removeView(mFloatingView);
}

}

我无法找出异常行为帮助我。

2 个答案:

答案 0 :(得分:0)

由于您希望服务持续投放,因此您必须覆盖onStartCommand方法并返回START_STICKY

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   return START_STICKY;
}
  

对于已启动的服务,他们可以决定运行另外两种主要操作模式,具体取决于它们从onStartCommand()返回的值:START_STICKY用于根据需要显式启动和停止的服务,而START_NOT_STICKY或START_REDELIVER_INTENT用于在处理发送给它们的任何命令时应保持运行的服务。有关语义的更多详细信息,请参阅链接的文档。

https://developer.android.com/reference/android/app/Service.html

答案 1 :(得分:0)

以forground身份启动您的服务。 https://developer.android.com/reference/android/app/Service.html#startForeground(int,android.app.Notification)