2017-02-13 25 views
0

Я написал операцию (вызванную службой), чтобы сделать popupwindow и завершил как действие, так и обслуживание, когда я нажимаю кнопку на экране или нажимаю кнопку «Назад». Вот код.Android - активность не закрыта кнопкой «Назад»

обслуживание:

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: попытка завершить входное событие, но приемник входных событий уже удален». печатается при нажатии кнопки «Назад». Это причина этой проблемы?

ответ

0

Назад событие потребляемый всплывающего окна, Вы можете попробовать отделочную активность onDismiss из всплывающего меню, или попробовать использовать диспетчерские Ключевые события.

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

О, спасибо, миллион. Этот код работает! – Laione

0

Некоторые из них попытаются убедить вас, что это нехорошее решение (по некоторым причинам), но я думаю, вы можете получить свой путь, чтобы заставить службу прекратить, добавив это в свой код после finish():

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

Best.

EDIT:

Я начинаю свою службу на OnCreate, делая это:

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

Тогда на мои методы закрытия, я убить процесс. Работает здесь.

+0

Спасибо за ответ, но и не работает ... :( – Laione

+0

Я думаю, что мы расходимся, как мы начинаем наши услуги, я здесь, а ты там. Сделал некоторые изменения в моем ответе, возможно, может помочь. Спасибо и удачи. – statosdotcom

0

Всплывающего окна поймать событие backpress, вы должны вызвать finish в KeyEvent listerner всплывающего окна в