【发布时间】:2011-03-14 16:18:52
【问题描述】:
我有一个应用程序,在主页上有用于导航应用程序的按钮。
在该页面上,我有一个“退出”按钮,点击该按钮后,用户应该会转到应用程序图标所在的手机主屏幕。
我该怎么做?
【问题讨论】:
标签: android exit back-button
我有一个应用程序,在主页上有用于导航应用程序的按钮。
在该页面上,我有一个“退出”按钮,点击该按钮后,用户应该会转到应用程序图标所在的手机主屏幕。
我该怎么做?
【问题讨论】:
标签: android exit back-button
不建议退出您的 Android 应用程序。有关更多详细信息,请参阅此question。
用户始终可以通过主页按钮或在第一个活动中通过返回按钮退出您的应用。
【讨论】:
Android 的设计不支持选择退出应用程序,而是由操作系统管理它。你可以通过对应的 Intent 调出 Home 应用:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
【讨论】:
如果您想结束一项活动,您只需致电finish()。
但是,在屏幕上设置退出按钮是一种不好的做法。
【讨论】:
当您调用该活动的完成 onDestroy() 时,将调用该活动并返回到活动堆栈中的上一个活动...所以..退出时不要调用完成();
【讨论】:
也许你可以试试这样的东西
假设在我们的应用程序中,我们有许多活动(比如十个),我们需要直接退出这个活动。我们可以做的是,创建一个意图并转到根活动并将意图中的标志设置为
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
另外,在意图中添加一些额外的布尔值
intent.putExtra("EXIT", true);
然后在根活动中,检查boolean 的值,并根据该调用完成(),在根活动的onCreate() 中
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
【讨论】:
onNewIntent。因为 intnet.getExtras() 一直为空。
RootActivity,而不是从堆栈中恢复它。在这里检查以克服这个stackoverflow.com/a/26258455/609782
System.exit(0);
可能是您正在寻找的。它将关闭整个应用程序并将您带到主屏幕。
【讨论】:
首先使用方法finish();完成您的应用程序
然后在 onDestroy 中添加以下行以移除强制关闭
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
【讨论】:
super.onDestroy() 在killProcess() 之后?这条线会到达吗?
在onDestroy() 中的finish(); 之后添加以下行:
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
【讨论】:
我尝试使用以下代码 sn-p 退出应用程序,这对我有用。希望这对您有所帮助。 我做了 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;
}
}
}
【讨论】:
这对我很有效。
关闭之前的所有活动如下:
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
}
【讨论】:
我用观察者模式做到了。
观察者界面
public interface Observer {
public void update(Subject subject);
}
基础主题
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'
}
}
【讨论】:
(我尝试了以前的答案,但它们在某些方面缺乏。例如,如果您在完成活动后不执行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;
在 MainActivity 的 onCreate 里面添加这个:
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = getApplicationContext();
super.onCreate(savedInstanceState);
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
return;
}
// your current codes
// your current codes
}
【讨论】:
某些活动实际上您不想在按下后退按钮时再次打开,例如启动屏幕活动、欢迎屏幕活动、确认窗口。实际上,您在活动堆栈中不需要这个。你可以使用=> 打开 manifest.xml 文件并添加一个属性来做到这一点
android:noHistory="true"
这些活动。
<activity
android:name="com.example.shoppingapp.AddNewItems"
android:label=""
android:noHistory="true">
</activity>
或
有时您想在按下某个后退按钮时关闭整个应用程序。这里的最佳做法是打开主窗口而不是退出应用程序。为此,您需要覆盖 onBackPressed() 方法。通常这个方法会打开栈顶的activity。
@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);
}
或
在按下后退按钮时,您想退出该活动,并且您也不想将其添加到活动堆栈中。在 onBackPressed() 方法中调用 finish() 方法。它不会关闭整个应用程序。它将用于堆栈中的上一个活动。
@Override
public void onBackPressed() {
finish();
}
【讨论】:
如果您想退出您的应用程序。然后在您的按钮按下事件中使用此代码。 喜欢:
public void onBackPressed()
{
moveTaskToBack(true);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
【讨论】:
还有另一种选择,使用 FinishAffinity 方法关闭堆栈中与应用程序相关的所有任务。
【讨论】:
这就是我所做的:
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,这将完成任务。
【讨论】:
如果你想退出应用程序 将此代码放在您的函数下
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);
}
【讨论】:
100% 工作正常。这是退出您的应用程序 onClick(方法)的代码
Button exit = (Button)findViewById(R.id.exitbutton);
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();
}
});
【讨论】:
您可以在退出按钮的onClickedListener 中添加moveTaskToBack(true) 以最小化应用程序。
希望对你有帮助。
【讨论】:
也许我的代码可以帮助(Main_Activity.java):
@Override
protected void onDestroy() {
super.onDestroy();
this.finish();
exit(0);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode) {
case KeyEvent.KEYCODE_BACK:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
// Go to backgroung
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
});
// Exit from app calling protected void onDestroy()
builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { onDestroy(); }
});
// Close this dialog
builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
});
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
return false;
}
【讨论】:
这是最简单的一个
finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
这将关闭应用程序,并且不会破坏方法服务,此任务将完成。
【讨论】:
您可以使用finish(); moveTaskToBack(true); 和System.exit(1); 退出您的应用程序。
public void onBackPressed() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Exit Application?");
alertDialogBuilder
.setMessage("Click yes to exit!")
.setCancelable(false)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
moveTaskToBack(true);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
【讨论】: