2017-02-13 2 views
0

Ich schrieb die Aktivität (vom Dienst aufgerufen), um Popup-Fenster zu erstellen und sowohl Aktivität als auch Dienst abgeschlossen, wenn ich auf die Schaltfläche auf dem Bildschirm klicken oder Zurück-Taste drücken. Hier ist der Code.Android - Aktivität wird nicht durch Zurück-Schaltfläche geschlossen

Service:

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(); 
    } 
} 

Aktivität:

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); 
    } 
} 

Wenn ich die Taste auf dem Bildschirm gedrückt, alles gut geht, dass ich erwartet hatte. Aber wenn ich Taste gedrückt habe, schließt es nur das Popup-Fenster, und der Dienst & Aktivität ist nicht abgeschlossen. Service und Aktivität sind beendet, wenn ich noch einmal auf die Schaltfläche "Zurück" geklickt habe, aber ich möchte alle mit einem Klick beenden.

Ich habe auch versucht, diese anstelle von onKeyDown(),

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

Aber es funktioniert auch nicht. Was muss ich in dieser Situation tun?

Oh, noch eine Sache. Das Protokoll 'W/InputEventReceiver: Es wurde versucht, ein Eingabeereignis zu beenden, aber der Eingabeereignisempfänger wurde bereits entfernt.' wird gedruckt, als ich den Zurück-Knopf drückte. Ist das die Ursache für dieses Problem?

Antwort

0

Zurück Ereignis durch Popup-Fenster verbraucht wird, können Sie versuchen, Aktivität onDismiss von Popup-Finishing oder versuchen Versand Wichtige Ereignisse verwenden.

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

Oh, Danke Millionen.Dieser Code funktioniert! – Laione

0

Einige werden versuchen, Sie davon zu überzeugen, dass dies keine gute Lösung ist (aus bestimmten Gründen), aber ich denke, Sie können Ihren Weg dazu bringen, Ihren Dienst zu stoppen, indem Sie dies Ihrem Code hinzufügen, nach finish():

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

Beste.

EDIT:

beginne ich meinen Dienst auf onCreate, indem dies zu tun:

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

Dann auf meine Abschlussmethoden, ich Prozess zu töten. Funktioniert hier.

+0

Vielen Dank für die Antwort, aber auch nicht funktioniert ... :( – Laione

+0

Ich denke, wir unterscheiden, wie wir unsere Dienste starten, mich hier, und Sie dort. Habe einige Bearbeitung in meiner Antwort, kann vielleicht helfen. Vielen Dank und viel Glück – statosdotcom

0

Popup-Fenster das backpress Ereignis fangen, sollten Sie finish in Pop-up-Fenster des KeyEvent listerner rufen

Verwandte Themen