2017-07-26 30 views
0

我有应用程序,我使用OverlayService绘制“allways-on-top”图标。我想显示对话框(自定义视图),当我点击这个图标。问题是,当应用程序暂停时 - 当我点击图标时没有任何反应,因为应用程序没有响应事件,暂停时。你可以帮帮我吗?谢谢。当应用程序暂停时在主屏幕上显示对话框

public class OverlayService extends Service { 

private WindowManager wm; 
private ImageView imageView; 


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

@Override 
public void onCreate() { 
    super.onCreate(); 

    imageView = new ImageView(this); 
    imageView.setImageResource(R.drawable.ic_launcher); 

    wm = (WindowManager) getSystemService(WINDOW_SERVICE); 

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 

    params.width = ViewGroup.LayoutParams.WRAP_CONTENT; 
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
    params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE; 
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
    params.format = PixelFormat.TRANSLUCENT; 
    params.gravity = Gravity.TOP | Gravity.RIGHT; 
    params.x = 0; 
    params.y = 100; 

    sendResultMessage(Constant.FAB_ICON_ONCLICK, "FAB icon onclicked."); 

    imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Log.d("OverlayService", "click"); 
      sendResultMessage(Constant.FAB_ICON_ONCLICK, "FAB icon onclicked."); 
     } 
    }); 

    imageView.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: 
        initialX = params.x; 
        initialY = params.y; 
        initialTouchX = event.getRawX(); 
        initialTouchY = event.getRawY(); 
        return true; 
       case MotionEvent.ACTION_UP: 
        imageView.performClick(); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        params.x = initialX - (int) (event.getRawX() - initialTouchX); 
        params.y = initialY + (int) (event.getRawY() - initialTouchY); 
        wm.updateViewLayout(imageView, params); 
        return true; 
      } 
      return false; 
     } 
    }); 

    wm.addView(imageView, params); 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 
    removeView(); 
} 

private void removeView() { 
    if (imageView != null) { 
     wm.removeView(imageView); 
    } 
} 

private void sendResultMessage(int cmd, String data) { 
    Log.d("sender", "Broadcasting result message: " + data); 
    Intent intent = new Intent(Constant.FILTER); 
    intent.putExtra(Constant.COMMAND, cmd); 
    intent.putExtra(Constant.DATA, data); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

}

public class StepsFragment extends DialogFragment { 
public static String LOG_TAG = "StepsFragment"; 
private TextView stepsText; 
Button closeButton; 
Button prevButton; 
Button nextbutton; 
Button stopRecordingFromStepsFragment; 
ArrayList<String> tasks = new ArrayList<String>(); 
TextView currentStepTextView; 

public StepsFragment() { 
    // Empty constructor is required for DialogFragment 
    // Make sure not to add arguments to the constructor 
    // Use `newInstance` instead as shown below 
} 

public static StepsFragment newInstance(String title) { 
    StepsFragment frag = new StepsFragment(); 
    Bundle args = new Bundle(); 
    args.putString(RecordingActivity.TEST_TITLE, title); 
    frag.setArguments(args); 
    return frag; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.steps_fragment, container); 

    closeButton = (Button) rootView.findViewById(R.id.closeButton); 
    prevButton = (Button) rootView.findViewById(R.id.prevButton); 
    nextbutton = (Button) rootView.findViewById(R.id.nextButton); 
    stopRecordingFromStepsFragment = (Button) rootView.findViewById(R.id.stopRecordingFromStepsFragment); 
    currentStepTextView = (TextView) rootView.findViewById(R.id.currentStepTextView); 

    Bundle bundle = this.getArguments(); 
    if (bundle != null) { 
     tasks = bundle.getStringArrayList(WebViewFragment.TASKS_API_RESPONSE); 

     if(tasks == null){ 
      tasks = new ArrayList<String>(); 
     } 
    } 

    closeButton.setOnClickListener(new Button.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      final View decorView = getDialog() 
        .getWindow() 
        .getDecorView(); 

      ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, 
        PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f), 
        PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f), 
        PropertyValuesHolder.ofFloat("pivotX", 900f), 
        PropertyValuesHolder.ofFloat("pivotY", 150f), 
        PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f) 
        ); 
      scaleDown.addListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        dismiss(); 
       } 

       @Override 
       public void onAnimationStart(Animator animation) { 
       } 
       @Override 
       public void onAnimationCancel(Animator animation) { 
       } 
       @Override 
       public void onAnimationRepeat(Animator animation) { 
       } 
      }); 
      scaleDown.setDuration(1000); 
      scaleDown.start(); 
     }}); 

    prevButton.setOnClickListener(new Button.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      onPrevButtonClicked(v); 
     }}); 

    nextbutton.setOnClickListener(new Button.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      onNextButtonClicked(v); 
     }}); 

    stopRecordingFromStepsFragment.setOnClickListener(new Button.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      onStopButtonClicked(); 
     }}); 

    initializeStopBtnInsteadOfNext(); 

    return rootView; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    currentStepTextView.setText(currentStepStringValue(WebViewFragment.stepsIndex , tasks.size())); 

    // Get field from view 
    stepsText = (TextView) view.findViewById(R.id.stepsText); 
    stepsText.setMovementMethod(new ScrollingMovementMethod()); 
    setStepsText(); 
    // Fetch arguments from bundle and set title 
    String title = getArguments().getString(RecordingActivity.TEST_TITLE, ""); 
    getDialog().setTitle(title); 
    // Show soft keyboard automatically and request focus to field 
    stepsText.requestFocus(); 
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
} 

private String currentStepStringValue(int stepsIndex, int tasksSize){ 
    return "Step " + (stepsIndex + 1) + " out of " + tasksSize; 
} 

@Override 
public void show(FragmentManager manager, String tag) { 

    try { 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.add(this, tag); 
     ft.commit(); 
    } catch (IllegalStateException e) { 
     Log.d(LOG_TAG, "Exception", e); 
    } 
} 

private void setStepsText(){ 
    if (WebViewFragment.stepsIndex < tasks.size() ){ 
     String taskDesc = tasks.get(WebViewFragment.stepsIndex); 
     stepsText.setText(taskDesc); 
    } 
} 

public void onCloseButtonCliked(View v){ 
    dismiss(); 
} 

public void onPrevButtonClicked(View v){ 
    if (WebViewFragment.stepsIndex> 0){ 
     WebViewFragment.stepsIndex -=1; 
     setStepsText(); 

     currentStepTextView.setText(currentStepStringValue(WebViewFragment.stepsIndex , tasks.size())); 
     nextbutton.setVisibility(View.VISIBLE); 
     stopRecordingFromStepsFragment.setVisibility(View.GONE); 
    } 
} 

public void onNextButtonClicked(View v){ 
    if (WebViewFragment.stepsIndex< this.tasks.size()){ 
     WebViewFragment.stepsIndex +=1; 
     setStepsText(); 
     currentStepTextView.setText(currentStepStringValue(WebViewFragment.stepsIndex , tasks.size())); 

     initializeStopBtnInsteadOfNext(); 
    } 
} 

private void initializeStopBtnInsteadOfNext(){ 
    if (WebViewFragment.stepsIndex == this.tasks.size() - 1){ 
     nextbutton.setVisibility(View.GONE); 
     stopRecordingFromStepsFragment.setVisibility(View.VISIBLE); 
    } 
} 

private void onStopButtonClicked(){ 
    if (WebViewFragment.stepsIndex == this.tasks.size() - 1){ 
     WebViewFragment.myChronometer.stop(); 
     callStopInRecordingActivity(); 
    } 
    else { 
     Toast.makeText(getActivity().getBaseContext(), R.string.not_completed_all_steps , Toast.LENGTH_LONG).show(); 
    } 
} 

private void callStopInRecordingActivity(){ 
    Intent intent = new Intent(getActivity(), RecordingActivity.class); 
    intent.putExtra(WebViewFragment.CALL_ON_STOP_RECORDING, WebViewFragment.CALL_ON_STOP_RECORDING); 

    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(intent); 
} 

public void onResume() { 
    // Store access variables for window and blank point 
    Window window = getDialog().getWindow(); 
    Point size = new Point(); 
    // Store dimensions of the screen in `size` 
    Display display = window.getWindowManager().getDefaultDisplay(); 
    display.getSize(size); 
    // Set the width of the dialog proportional to 85% of the screen width 
    window.setLayout((int) (size.x * 0.85), (int) (size.y * 0.85)); 
    window.setGravity(Gravity.CENTER); 
    // Call super onResume after sizing 
    super.onResume(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    final View decorView = getDialog() 
      .getWindow() 
      .getDecorView(); 

    ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView, 
      PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f), 
      PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f), 
      PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f)); 
    scaleDown.setDuration(1000); 
    scaleDown.start(); 
} 

}

public class WebViewActivity extends MainActivity { 
boolean showOverlayService = false; 
public final static int REQUEST_CODE = 15; 
public static String LOG_TAG = "WebViewActivity"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_empty); 
    super.onCreateDrawer(); 

    showOverlayService = getIntent().getBooleanExtra(RecordingActivity.RUN_OVERLAY_SERVICE, false); 

    if (showOverlayService){ 
     if (Build.VERSION.SDK_INT >= 23) { 
      checkDrawOverlayPermission(); 
     } 
     else { 
      startOverlayService(); 
     } 
    } 


    Fragment fragment = new WebViewFragment(); 
    fragment.setArguments(getIntent().getExtras()); 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.main_fragment_container, fragment).commit(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.e(LOG_TAG, "onStart()"); 
    LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver), new IntentFilter(Constant.FILTER)); 
    // The activity is about to become visible. 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    Log.e(LOG_TAG, "onStop()"); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); 
    // The activity is no longer visible (it is now "stopped") 
} 

@Override 
public void onBackPressed() { 
    // intentionally blank 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 

} 

private void checkDrawOverlayPermission() { 
    /** check if we already have permission to draw over other apps */ 
    if (!Settings.canDrawOverlays(this)) { 
     /** if not construct intent to request permission */ 
     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
       Uri.parse("package:" + getPackageName())); 
     /** request permission via start activity for result */ 
     startActivityForResult(intent, REQUEST_CODE); 
    } 
    startOverlayService(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    /** check if received result code 
    is equal our requested code for draw permission */ 
    if (requestCode == REQUEST_CODE) { 
     if (Settings.canDrawOverlays(this)) { 
      // continue here - permission was granted 
      Log.d(LOG_TAG, "startOverlayService("); 
      startOverlayService(); 
     } 
    } 
} 

private void startOverlayService(){ 
    Intent intent = new Intent(this, OverlayService.class); 
    intent.putExtras(getIntent().getExtras()); 
    startService(intent); 
} 

private void onFabClick(){ 
    FragmentManager fm = getSupportFragmentManager(); 

    Bundle bundle = new Bundle(); 
    bundle.putStringArrayList(WebViewFragment.TASKS_API_RESPONSE, getIntent().getStringArrayListExtra(RecordingActivity.TEST_TASKS)); 

    StepsFragment stepsFragment = StepsFragment.newInstance(getIntent().getStringExtra(RecordingActivity.TEST_TITLE)); 
    stepsFragment.setArguments(bundle); 
    stepsFragment.show(fm, "steps_fragment"); 
} 

/* 
* SERVICE COMMUNICATORS 
*/ 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(LOG_TAG, "Got message"); 
     handleMessage(intent); 
    } 
}; 

/* 
* Handle message from services 
*/ 
private void handleMessage(Intent msg) { 
    Bundle data = msg.getExtras(); 

    switch (data.getInt(Constant.COMMAND, 0)) { 
     case Constant.FAB_ICON_ONCLICK: 
      onFabClick(); 
      break; 
     default: 
      break; 
    } 
} 

}

回答

0

您还可以使用广播接收器,并确保您注册吧! 然后如果您使用对话框将以下代码复制到您的对话框代码。

yourDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

并添加权限到您的的manifest.xml

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

不要忘记实现代码来检查在Android 6.0.1权限。

相关问题