2014-09-04 2 views
2

Итак, я пытаюсь создать приложение, которое будет функционировать как будильник для телефонов Android, оно будет предупреждать пользователя в выбранное время. Когда появится экран предупреждения, пользователь может нажать уведомление или отложить, и приложение будет вызывать уведомление, а затем закрыть.Приложение не закрывается после завершения()

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

Редактировать: Я знаю, что есть некоторые коды, такие как System.exit() или killProcess, так как этот код не рекомендуется, я предпочитаю избегать их использования. Причина, по которой я спрашиваю, заключается в том, что я проверил приложение реального времени, которое поставляется вместе с моим телефоном (4.3), и экран предупреждения будет закрыт после того, как я нажму кнопку повтора или отмена. Так что для меня должен быть способ сделать то же самое, не так ли?

Ответ Хорошо, так Sagar Pilkhwal пояснены ниже, и после прочтения других связанных проблем, я обнаружил, что нет «хорошего» способа, чтобы закрыть вам приложение по кодам, вы должны оставить эту опцию для пользователей или ОПЕРАЦИОННЫЕ СИСТЕМЫ. Если вы не хотите использовать System.exit или killProcess, но это плохие способы заставить ваше приложение закрыться.

Sagar Pilkhwal также может альтернативно использовать эту проблему, если вы не хотите, чтобы в последнем приложении появился ваш экран предупреждения, вы вызываете другое действие.

Однако, что касается этого случая и диспетчера аварийных сообщений в общем случае, откройте MainActivity, что приведет к неприятным материалам, поскольку MainActivity - это когда мы обрабатываем события Alarm. Потом я узнал еще одно решение, если вы не хотите, чтобы ваш экран предупреждения появляется в последнем приложении, просто добавьте

android:excludeFromRecents="true" 

к вашей Alert.class деятельности в манифесте, или добавить Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS намерению используется для запуска Alert.class.

Это приведет к другой проблеме, так как когда пользователь нажимает кнопку «Домой», будильник не отключается, и пользователь не может открыть последнее приложение для доступа к экрану предупреждения (он должен будет открыть приложение для этого). Я исправляю эту проблему, пытаясь обнаружить нажатие кнопки home button. Подробный ответ приведен ниже.

+0

Рассмотрим сделать [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). Это много кода, и не все это необходимо для воспроизведения вашей проблемы. Было бы полезно включить язык, на который вы запрограммировали это и на каком устройстве (устройствах), для которого вы программируете. –

+0

Спасибо, я отредактировал и удалил некоторые из этих кодов. В остальном я действительно не знаю, относится ли это к проблеме или нет (если я знаю, что тогда я не стану задавать этот вопрос), так что, чтобы быть в безопасности, я все еще сохраняю это. – Usin2705

ответ

1

Дизайн Android не способствует удалению приложения по своему выбору, а скорее управляет его ОС. Вы можете вызвать Начальное приложение его соответствующий Intent:

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

Итак, технически, нет ничего плохого в моем коде? Причина, по которой приложение не закрывается после финиша, заключается не в том, что я случайно ввел в него неправильный код, а потому, что Android обрабатывает приложение именно так? – Usin2705

+0

да, вы можете так сказать, попробуйте 'this.finish();' если вы хотите действительно выйти из своего приложения, тогда попробуйте 'android.os.Process.killProcess (android.os.Process.myPid());' или 'System .exit (0); ' –

+0

@Sagar. Я столкнулся с этой проблемой, вы можете мне помочь. –

1

хорошо im думаюnig.

System.exit(0); 

возможно? Я новичок в андроиде ... но иногда я его использую ..

+1

Никогда не используйте 'System.exit (0)'. Это противоречит практике кодирования Android. Он предназначен для немедленного выхода из приложения, которое вам не нравится. Альтернативой является использование метода finish(), если у вас есть причина оставить приложение досрочно. Что произойдет, если 'System.exit (0)' выполнить? Ans: VM останавливает дальнейшее выполнение, и программа будет завершена. –

+0

oh ok .. так что предназначен для жестокой силовой отделки справа? поэтому услуги и приемники также будут убиты? правильно?? @SagarPilkhwal – 2014-09-04 18:59:25

+0

Проверьте это [сообщение] (http://stackoverflow.com/a/18802574/3326331), в котором говорится о проблемах с * AdMob *, когда используется 'System.exit (0);'. –

0
System.exit(0); 

Это право будет закрыть приложение из ничего не оставляя работает в background.However, используйте это мудро и не оставлять открытых файлов, баз данных обрабатывает открытым, и т.д. Эти вещи, как правило, быть очищены через finish().

Я лично НЕНАВИЖУ, когда выбираю Выход в приложении, и он действительно не выходит.

1

Поместите следующий манифест, в вашем оповещении деятельности:

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

Вы также можете добавить android:launchMode="singleInstance" и android:taskAffinity="" (если вы знаете, что они делают)

В классе оповещения, использовать это, чтобы обнаружить домашняя кнопка нажата событие:

@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);} 
Смежные вопросы