2010-07-12 2 views
174

У меня есть приложение, где на домашней странице у меня есть кнопки для навигации по приложению.Как выйти из приложения и показать главный экран?

На этой странице у меня есть кнопка «ВЫХОД», которая при нажатии должна вывести пользователя на главный экран телефона, на котором находится значок приложения.

Как я могу это сделать?

ответ

300

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

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_HOME); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
+0

: Большое спасибо .. – Surej

+23

Вы даже можете использовать .. "moveTaskToBack (true);" –

+0

Thanx для предложения очень полезно – user1387035

16

Не рекомендуется покидать приложение для Android. См. Это question для более подробной информации.

Пользователь всегда может покинуть ваше приложение с помощью кнопки «Дом» или в первом действии с помощью кнопки «Назад».

+1

я получил концепцию после прочтения этой страницы. спасибо – poojan9118

+3

@janusz: нажатие кнопки дома никогда не прекращает приложения для Android, вместо этого идет в фоновом режиме ... – Jayesh

18

Если вы хотите закончить деятельность, вы можете просто позвонить finish(). Как правило, плохой практикой является кнопка выхода на экран.

+2

Я использую его для «Вам нужно обновить это приложение до последней версии», и я не хочу, чтобы они продолжали его использовать. Еще плохая практика ...? – beetree

+0

@beetree Да. Как и любая плохая практика, есть случаи, когда это ваш единственный вариант, и вы используете его, потому что попытка сделать что-то еще будет бессмысленной. Суть его в том, что это _bad practice_, в отличие от _illegal syntax_, заключается в том, что он доступен для этих немногих случаев, но вы должны попробовать свой самый страшный, чтобы найти лучший способ сделать это. В вашем случае нет никого. –

3

Когда будет вызван вызов завершения onDestroy() этого действия, он вернется к предыдущему действию в стеке действий ... Итак .. для выхода не вызывайте finish();

71

Может быть, вы можете попробовать что-то вроде этого

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

также добавить некоторые дополнительные, как логическое значение намерению

intent.putExtra("EXIT", true); 

Тогда в корневой деятельности , проверить значение boolean и в соответствии с этой отделкой вызова(), в onCreate() корневой активности

if (getIntent().getBooleanExtra("EXIT", false)) { 
finish(); 
} 
+1

Просто не делайте ничего в onCreate, чтобы вызывать финиш. – imcaptor

+2

В моем случае мне пришлось переопределить 'onNewIntent'. Потому что intnet.getExtras() остается равным нулю. – zznq

+0

И этот метод перезапустит вашу 'RootActivity' вместо того, чтобы возобновить ее из стека. Проверьте здесь, чтобы преодолеть это http://stackoverflow.com/a/26258455/609782 – Darpan

26
System.exit(0); 

Возможно, вы ищите. Он закроет все приложение и перенесет вас на главный экран.

+1

Должно ли это быть в нижнем регистре? – Carol

+0

Нет ... копировать и вставлять как есть – Ndupza

+1

должен быть System.exit (0). Но в любом случае это не очень полезно. –

22

первый конец приложение с использованием метода finish();

, а затем добавить ниже линии в OnDestroy для снятие силы близко

android.os.Process.killProcess(android.os.Process.myPid()); 
super.onDestroy(); 
+5

+1, который работает как шарм. – JCasso

+3

никогда не используйте это, потому что у него нет шансов освободить ресурсы – Jacky

+1

-1, потому что onDestroy выполняется всякий раз, когда вы покидаете активность, а не только при нажатии на заднюю клавишу. –

0

Добавить следующие строки после finish(); в onDestroy():

android.os.Process.killProcess(android.os.Process.myPid()); 
super.onDestroy(); 
0

Я попытался выходя из приложения, используя следующий фрагмент кода, это сработало для меня. Надеюсь, это вам поможет. я сделал небольшой демо 2 деятельности

первой активности

public class MainActivity extends Activity implements OnClickListener{ 
    private Button secondActivityBtn; 
    private SharedPreferences pref; 
    private SharedPreferences.Editor editer; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn); 
     secondActivityBtn.setOnClickListener(this); 

     pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE); 
     editer = pref.edit(); 

     if(pref.getInt("exitApp", 0) == 1){ 
      editer.putInt("exitApp", 0); 
      editer.commit(); 
      finish(); 
     } 
    } 
    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.SecondActivityBtn: 
      Intent intent= new Intent(MainActivity.this, YourAnyActivity.class); 
      startActivity(intent); 
      break; 
     default: 
      break; 
     } 
    } 
} 

ваша любая другая деятельность

public class YourAnyActivity extends Activity implements OnClickListener { 
    private Button exitAppBtn; 
    private SharedPreferences pref; 
    private SharedPreferences.Editor editer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_any); 

     exitAppBtn = (Button) findViewById(R.id.exitAppBtn); 
     exitAppBtn.setOnClickListener(this); 

     pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE); 
     editer = pref.edit(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.exitAppBtn: 
      Intent main_intent = new Intent(YourAnyActivity.this, 
        MainActivity.class); 
      main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(main_intent); 
      editer.putInt("exitApp",1); 
      editer.commit(); 
      break; 
     default: 
      break; 
     } 
    } 
} 
22

Это хорошо работает для меня.
Закройте все предыдущие действия следующим образом:

Intent intent = new Intent(this, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.putExtra("Exit me", true); 
    startActivity(intent); 
    finish(); 

Тогда в MainActivity OnCreate() метод добавить это, чтобы закончить MainActivity

setContentView(R.layout.main_layout); 

    if(getIntent().getBooleanExtra("Exit me", false)){ 
     finish(); 
     return; // add this to prevent from doing unnecessary stuffs 
    } 
+1

Это отлично работает отлично –

+1

Это! Работал для меня, спасибо – Webserveis

+0

Спасибо большое! – Weaboo

0

Я сделал это с режимом наблюдателя.

интерфейс Observer

public interface Observer { 
public void update(Subject subject); 
} 

Base Тема

public class Subject { 
private List<Observer> observers = new ArrayList<Observer>(); 

public void attach(Observer observer){ 
    observers.add(observer); 
} 

public void detach(Observer observer){ 
    observers.remove(observer); 
} 

protected void notifyObservers(){ 
    for(Observer observer : observers){ 
     observer.update(this); 
    } 
} 
} 

Ребенок Subject реализует метод выхода из

public class ApplicationSubject extends Subject { 
public void exit(){ 
    notifyObservers(); 
} 
} 

MyApplication, которые ваше приложение должно расширяющий его

public class MyApplication extends Application { 

private static ApplicationSubject applicationSubject; 

public ApplicationSubject getApplicationSubject() { 
      if(applicationSubject == null) applicationSubject = new ApplicationSubject(); 
    return applicationSubject; 
} 

}

Базовая активность

public abstract class BaseActivity extends Activity implements Observer { 

public MyApplication app; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    app = (MyApplication) this.getApplication(); 
    app.getApplicationSubject().attach(this); 
} 

@Override 
public void finish() { 
    // TODO Auto-generated method stub 
      app.getApplicationSubject().detach(this); 
    super.finish(); 
} 

/** 
* exit the app 
*/ 
public void close() { 
    app.getApplicationSubject().exit(); 
}; 

@Override 
public void update(Subject subject) { 
    // TODO Auto-generated method stub 
    this.finish(); 
} 

} 

давайте проверим это

public class ATestActivity extends BaseActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    close(); //invoke 'close' 
} 
} 
5

(я пробовал предыдущие ответы, но они не хватает в некоторых точках. Например, если после завершения операции не выполняется return;, выполняется оставшийся код операции. Также вам нужно отредактировать onCreate с возвратом. Если вы не запустите super.onCreate(), вы получите ошибку времени выполнения)

Скажите, что у вас есть MainActivity и ChildActivity.

Внутри ChildActivity добавить следующее:

Intent intent = new Intent(ChildActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("EXIT", true); 
startActivity(intent); 
return true; 

OnCreate Внутри MainActivity Добавить это:

@Override 
public void onCreate(Bundle savedInstanceState) { 

    mContext = getApplicationContext(); 

    super.onCreate(savedInstanceState); 

    if (getIntent().getBooleanExtra("EXIT", false)) { 
     finish(); 
     return; 
    } 
    // your current codes 
    // your current codes 
} 
16

Некоторые виды деятельности на самом деле вы не хотите, чтобы открыть снова при нажатии кнопки назад нажимается такой выплеск экран активность, Добро пожаловать Экранная активность, подтверждение Windows. На самом деле вам это не нужно в стеке действий. Вы можете сделать это, используя => файл открытым manifest.xml и добавить атрибут

андроида: noHistory = "истинный"

к этой деятельности.

<activity 
    android:name="com.example.shoppingapp.AddNewItems" 
    android:label="" 
    android:noHistory="true"> 
</activity> 

ИЛИ

Иногда вы хотите закрыть все приложения в определенной назад кнопки. Здесь лучше всего открыть окно дома вместо выхода из приложения. Для этого вам необходимо переопределить метод onBackPressed(). обычно этот метод открывает верхнюю активность в стеке.

@Override 
public void onBackPressed(){ 
Intent a = new Intent(Intent.ACTION_MAIN); 
a.addCategory(Intent.CATEGORY_HOME); 
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(a); 

} 

ИЛИ

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

@Override 
public void onBackPressed() { 
    finish(); 
} 
-1

Если вы хотите выйти из приложения. Затем используйте этот код внутри нажатой кнопки. как:

public void onBackPressed() 
{ 
    moveTaskToBack(true); 
    android.os.Process.killProcess(android.os.Process.myPid()); 
    System.exit(1); 
} 
1

Вот что я сделал:

SomeActivity.java

@Override 
    public void onBackPressed() { 
      Intent newIntent = new Intent(this,QuitAppActivity.class); 
      newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(newIntent); 
      finish(); 
    } 

QuitAppActivity.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     finish(); 
} 

В основном, вы выполнили очистку всех действий из стека и запустили QuitAppActivity, чья задача - выйти из приложения.

0

, если вы хотите, чтобы выйти из приложения поместить этот код под функцией

public void yourFunction() 
{ 
finishAffinity(); 
moveTaskToBack(true); 

} 



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used. 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) { 
     // do something on back. 
     From Android 16+ you can use the following: 

     finishAffinity(); 
     moveTaskToBack(true); 
    } 

    return super.onKeyDown(keyCode, event); 
} 
Смежные вопросы