Android - 活动未按“后退”按钮关闭

时间:2017-02-13 01:03:50

标签: android android-activity service back-button

当我点击屏幕上的按钮或按下后退按钮时,我编写了活动(由服务调用)来制作popupwindow并完成了活动和服务。这是代码。

服务:

public class AlarmService extends Service {

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

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      Intent popupIntent = new Intent(AlarmService.this, AlarmPopup.class);
      popupIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

      startActivity(popupIntent);
      return super.onStartCommand(intent, flags, startId);
  }

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

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

的活动:

public class AlarmPopup extends AppCompatActivity {
  PopupWindow popup;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Handler handler = new Handler();
      final Runnable r = new Runnable() {
          public void run() {
              onShowPopup();
          }
      };
        handler.postDelayed(r, 500);
  }

  public void onShowPopup() {
      LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      final View view = inflater.inflate(R.layout.alarm_popup, null);
      popup = new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT,
              LinearLayout.LayoutParams.MATCH_PARENT, true);
      popup.setBackgroundDrawable(new BitmapDrawable());

      popup.showAtLocation(view, Gravity.CENTER, 0, 0);
      view.findViewById(R.id.button).setOnClickListener(mClickListener);
  }

  Button.OnClickListener mClickListener = new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Intent i = new Intent(AlarmPopup.this, AlarmService.class);
          stopService(i);
          popup.dismiss();
          finish();
      }
  };

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event)  {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
          Intent i = new Intent(AlarmPopup.this, AlarmService.class);
          stopService(i);
          popup.dismiss();
          finish();
          return true;
      }
      return super.onKeyDown(keyCode, event);
  }
}

当我按下屏幕上的按钮时,一切都很顺利。但当我按下后退按钮时,它只会关闭弹出窗口,以及服务&活动没有完成。当我再次单击后退按钮时,服务和活动完成,但我希望通过单击完成所有这些操作。

我也试过这个而不是onKeydown(),

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent i = new Intent(AlarmPopup.this, AlarmService.class);
    stopService(i);
    popup.dismiss();
    finish();
}

但它也不起作用。在这种情况下我需要做什么?

哦,还有一件事。日志'W / InputEventReceiver:尝试完成输入事件但输入事件接收器已被处理掉。单击后退按钮时打印。这是导致这个问题的原因吗?

3 个答案:

答案 0 :(得分:0)

有些人会试图说服你这不是一个好的解决方案(由于某些原因),但我认为你可以通过在完成后将你的服务添加到你的代码中来阻止你的服务停止( )

android.os.Process.killProcess(android.os.Process.myPid());

最佳。

修改

我在 onCreate 上启动我的服务,方法是:

intent = new Intent(this, ServiceActivity.class);
    startService(intent);

然后,在我的关闭方法中,我杀了进程。在这里工作。

答案 1 :(得分:0)

弹出窗口捕获背压事件,你应该在弹出窗口的KeyEvent listerner中调用finish

答案 2 :(得分:0)

弹出窗口会消耗后退事件,您可以尝试在弹出的消息上完成活动,或尝试使用调度键事件。

  popup.setOnDismissListener(new PopupWindow.OnDismissListener() {
      @Override
      public void onDismiss() {
          Intent i = new Intent(AlarmPopup.this, AlarmService.class);
          stopService(i);
          finish();
      }
  });