2014-09-04 6 views
2

Android 용 알람 시계와 같은 기능을 갖춘 앱을 만들려고합니다. 선택한 시간에 사용자에게 알립니다. 알림 화면이 나타나면 사용자는 알림을 보내거나 스누즈 할 수있는 옵션이 있으며 앱에서 알림을 누른 다음 닫습니다.finish() 후 앱이 닫히지 않습니다.

그러나 알림 또는 알림 버튼을 클릭하면 앱이 닫히지 않았습니다. 대신 앱이 알람 소리를 중지하고 최소화합니다 (사용자가 홈 버튼을 터치 할 때와 마찬가지로). 최근 앱을 터치하면 알림 화면을 다시 열 수 있습니다.

편집 : System.exit() 또는 killProcess와 같은 코드가 있으므로 코드를 권장하지 않으므로 사용하지 않는 것이 좋습니다. 내가 묻는 이유는 내 휴대 전화 (4.3)와 함께 제공되는 실제 시계 앱을 테스트했기 때문에 내가 잠자기를 누르거나 버튼을 닫은 후에 알림 화면이 닫히기 때문입니다. 그래서 저도 똑같이 할 수있는 방법이 있어야합니다, 그렇죠?

대답 Sagar Pilkhwal 아래에 설명 된대로 그렇게, 그리고 다른 관련 문제를 읽은 후, 나는 코드로 응용 프로그램을 닫으려면 더 "좋은"방법이 없다는 것을 발견, 좋아 , 당신은 사용자에게 해당 옵션을 떠날 필요가 또는 OS. System.exit이나 killProcess를 사용하고 싶지 않다면 앱을 강제 종료하는 나쁜 방법입니다.

Sagar Pilkhwal도이 문제에 대한 대안 방법이 있습니다. 최근 앱에서 알림 화면을 표시하지 않으려면 다른 활동을 불러 오십시오.

그러나이 경우와 Alarm Manager 일반적으로 MainActivity는 Alarm 이벤트를 처리 할 때 MainActivity가 열려 있기 때문에 열려있는 MainActivity가 문제가 될 수 있습니다. 그 때 나는 당신이 당신의 경고 화면이 최근의 응용 프로그램에 표시하지 않으려면, 단순히 매니페스트에 Alert.class 활동에

android:excludeFromRecents="true" 

를 추가하거나 시작하는 데 사용 의도에 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS를 추가, 다른 해결책을 발견 Alert.class.

사용자가 홈 버튼을 누르면 알람이 꺼지지 않고 사용자가 알림 화면에 액세스하기 위해 최근 앱을 열 수 없기 때문에 다른 문제가 발생합니다. 앱). 홈 버튼 눌림 이벤트를 감지하여이 문제를 해결합니다. 세부 답변은 아래와 같습니다.

+0

은 [최소한의 완전하고 검증 예]를 고려해보십시오 (http://stackoverflow.com/help/mcve). 이것은 많은 코드이며 문제를 재현하는 데 필요한 모든 것이 아닙니다. 프로그래밍 한 언어와 프로그래밍 할 장치를 포함하면 도움이됩니다. –

+0

감사합니다. 코드를 편집하고 제거했습니다. 나머지 부분은 문제와 관련이 있는지 없는지 (내가이 질문을하지 않을 것이라는 것을 알고 있다면) 안전하지 않기 때문에 계속 유지합니다. – Usin2705

답변

1

안드로이드의 디자인은 선택에 의해 애플리케이션을 종료하는 것이 아니라 오히려 OS에 의해 관리됩니다. 단지 전화

public void quit() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(startMain); 
} 

때문에 권장하지 방법 응용 프로그램을 닫습니다 :

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

또는

System.exit(0); 

그렇지 않으면 특정 생활로 인해 간을하면 해당 의도로 홈 응용 프로그램을 가져올 수 Android 활동의 순환 - 응용 프로그램이 종료/종료되었는지 확인할 수 없습니다.

+0

기술적으로, 내 코드에는 아무 문제가 없습니까? 완료 후 앱이 닫히지 않는 이유는 실수로 잘못된 코드가 삽입 되었기 때문이 아니라 안드로이드가 그런 식으로 애플리케이션을 처리하기 때문입니다. – Usin2705

+0

네, 그렇게 말할 수 있습니다. 정말로 당신의 응용 프로그램을 끝내고 싶다면'this.finish();'를 시도해보고'android.os.Process.killProcess (android.os.Process.myPid());'또는'System .exit (0);' –

+0

@Sagar이 문제에 직면하고 있습니다. –

1

잘 생각해.

System.exit(0); 

어쩌면? 나는 새로운 것을 android thou ..하지만 때로는 그것을 사용합니다 ..

+1

'System.exit (0)'을 사용하지 마십시오. 그것은 안드로이드 코딩 관행에 반대된다. 그것은 당신이 원하는 것이 아닌 앱을 즉시 종료하도록 설계되었습니다. 또 다른 방법은 미리 성숙하게 앱을 종료해야하는 경우 finish() 메소드를 사용하는 것입니다. 'System.exit (0)'이 실행되면 어떻게됩니까? 답변 : VM이 더 이상 실행을 멈추고 프로그램이 종료됩니다. –

+0

오 오 .. 그래서 잔인한 힘을 끝내기위한 것입니까? 그래서 서비스와 수신자도 살해 당할거야 ?? 권리?? @SagarPilkhwal –

+0

'System.exit (0);'을 사용할 때 * AdMob *에 문제가 있다고 표시된이 [post] (http://stackoverflow.com/a/18802574/3326331)를 확인하십시오. –

0
System.exit(0); 

바로 background.However에서 실행 아무것도 남기지 않고 응용 프로그램을 거기 닫을 것, 현명이를 사용하여 열려있는 파일을 떠나지 말아요, 데이터베이스가 열려 처리, etc.These 일이 보통을 통해 정리 될 것이다 finish() 명령.

저는 개인적으로 응용 프로그램에서 나가기를 선택하면 정말 싫어합니다.

1

넣어 당신의 경보 활동, 매니페스트 다음 (당신은 그들이 무엇을 알고있는 경우) 또한 감지 이것을 사용, Alert 클래스에서

android:launchMode="singleInstance"android:taskAffinity=""을 추가 할 수 있습니다

android:excludeFromRecents="true" //this will make the Activity be exclude from recents list. 

홈 버튼을 누르면 이벤트 :

@Override 
public void onPause() { 
    if (!isFinishing()) { 
     createNotf(); //Handle home button press here. 
    } 
    super.onPause(); 
} 

사용이 누른 버튼을 다시 처리하는 (당신이 감지하려면이 코드가 필요 홈 단추 누르기 isFinishing(); 내 경우를 들어

@Override 
public void onBackPressed() { 
    //Handle BackButton event here. 
} 

만 사용자를 눌러 홈 버튼, 나는 알림을 생성합니다, 그래서 그는 알림을 클릭하거나 화면에게 :

private void createNotf() { 
    Intent screenIntent = new Intent(MyAlert.this, MyAlert.class); 
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
    PendingIntent pIntent = PendingIntent.getActivity(MyAlert.this, MainActivity.SEND_ALARM_CODE, screenIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
    Notification.Builder ntfBuilder = new Notification.Builder(this) 
    .setAutoCancel(true) 
    .setContentTitle("ALARM_RUNNING") 
    .setLargeIcon(bitmap) 
    .setSmallIcon(R.drawable.ic_launcher) 
    .setContentText("CLICK_TO_OPEN_ALERTSCREEN.") 
    .setContentIntent(pIntent); 

    NotificationManager myNotfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    myNotfM.notify(999, ntfBuilder.build());   
} 
을 경고하기 위해 액세스를 다시 응용 프로그램을 열 수 있습니다 때 경고가 중지하면

, 그 통지도 분명있을 것입니다 :

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    NotificationManager mntfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    mntfM.cancel(999);} 
관련 문제