2017-05-10 8 views
0

、私はサービスで問題であるかを把握することができませんでしだ を呼び出すことなく、自動的に停止します。私はどこからでもstopService()またはstopSelfを呼び出すわけではありません。以下のコード、Androidのサービスはdesstroyed、私は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); 
} 

}

私は私を助ける異常な挙動を把握することはできませんよです。

+0

は、ログ内のすべてのクラッシュやエラーを見ていますか? –

+0

いいえ、私はlogcatに何も見ていません。 –

+0

おそらくあなたのプロセスは終了しました。 – CommonsWare

答えて

0

、あなたのサービスが継続的にあなたがonStartCommandメソッドをオーバーライドする必要があると始めたサービスについてはSTART_STICKY

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

を返します実行したいので、彼らが実行することを決定することができる操作の二つの追加の主要なモードがあります。 START_STICKYが明示的に開始し、必要に応じてSTART_NOT_STICKYまたはSTART_REDELIVER_INTENTがそれらに送信されたコマンドの処理中にのみ実行されているままにしてくださいサービスに使用されている間、停止しているサービスのために使用されます、値に応じて、彼らはonStartCommand()から復帰します。セマンティクスの詳細については、リンクされたドキュメントを参照してください。

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

+0

情報を処理するためにサービスを制限するサービスは自動的に再起動するたびにいいえ、START_STICKYはちょうどヌル意思値を返します。しかし、なぜサービスが再開していますか?何か案が? @Nate –

+0

Androidフレームワークがこれを担当しています。メモリが少ないときはいつでもコンポーネントを強制終了させる優先スタックを維持し、メモリが利用可能になったときにそれらを再起動します。 – mnp343

+0

それは@ mnp343に役立ちますが、どうすればよいですか? –

関連する問題