在Android中退出程式比較麻煩,尤其是在多個Activity的程式中,在2.2之前可以採用如下代碼退出程式:
Java代碼
[java]
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
此種方法是一種最方便和最簡單的退出程式的辦法,但是在2.2和2.2之後就不能用了,那麼如果我們要退出程式有4種辦法:
採用content view棧:如果程式是多介面,但是又沒有強制要求每一個介面一個Activity,可以將每個介面設計為一個View,在介面切換時,只需要調用Activity的setContentView方法設定Activity的Contentview,這樣退出程式只需要將這一個Activity退出 就可以了,但是需要設計一個棧來管理content view。
可以自訂一個Activity的棧,在程式退出時將棧中的所有的Activity進行finish,這種方法,我以前的文章中有詳述。
前兩種方法的精髓之處都是需要自己設計一個棧用來管理介面或者Activity,這樣程式就比較複雜一些。 第3中方法就是,先讓程式到Home介面,然後再將process殺死:代碼如下:
[java]
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(Process.myPid());
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(Process.myPid());
4.還有一種就是使用方法是使用Android的Broadcast機制。在所有的Activity中註冊退出程式的訊息,當收到訊息時調用finish方法。 然後再有退出程式功能的Activity上廣播關閉訊息。代碼如下:
[java]
package com.kingtone.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* 所有Activity的父類,用來註冊退出程式的廣播事件,
* 並且對收到的退出程式事件進行處理
* @author Administrator
*
*/
public class CommonActivity extends Activity {
//廣播的內部類,當收到關閉事件時,調用finish方法結束activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
@Override
public void onResume() {
super.onResume();
//在當前的activity中註冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction(GlobalVarable.EXIT_ACTION);
this.registerReceiver(this.broadcastReceiver, filter);
}
}
package com.kingtone.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* 所有Activity的父類,用來註冊退出程式的廣播事件,
* 並且對收到的退出程式事件進行處理
* @author Administrator
*
*/
public class CommonActivity extends Activity {
//廣播的內部類,當收到關閉事件時,調用finish方法結束activity
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
@Override
public void onResume() {
super.onResume();
//在當前的activity中註冊廣播
IntentFilter filter = new IntentFilter();
filter.addAction(GlobalVarable.EXIT_ACTION);
this.registerReceiver(this.broadcastReceiver, filter);
}
}
在需要退出程式的Activity(CommonActivity的子類)中,退出程式碼如下:
[java]
Intent intent = new Intent();
intent.setAction(GlobalVarable.EXIT_ACTION); // 退出動作
this.sendBroadcast(intent);// 發送廣播
super.finish();
//退出後台線程,以及銷毀靜態變數
System.exit(0);
Intent intent = new Intent();
intent.setAction(GlobalVarable.EXIT_ACTION); // 退出動作
this.sendBroadcast(intent);// 發送廣播
super.finish();
//退出後台線程,以及銷毀靜態變數
System.exit(0);
監聽並處理使用者按下back鍵的方法
[java]
package com.example.android_test01;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("你按下了back1");
show_simple();
return super.onKeyDown(keyCode, event);
}
//先調用的onKeyDown(int keyCode, KeyEvent event)方法,然後調用的onBackPressed()方法;
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
System.out.println("按下back,立刻退出activity時調用");
super.onBackPressed();
}
public void show_simple()
{
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("歡迎使用本軟體");
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//退出應用;
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}) ;
builder.create().show();
}
}
package com.example.android_test01;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
System.out.println("你按下了back1");
show_simple();
return super.onKeyDown(keyCode, event);
}
//先調用的onKeyDown(int keyCode, KeyEvent event)方法,然後調用的onBackPressed()方法;
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
System.out.println("按下back,立刻退出activity時調用");
super.onBackPressed();
}
public void show_simple()
{
AlertDialog.Builder builder=new Builder(this);
builder.setTitle("歡迎使用本軟體");
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//退出應用;
finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}) ;
builder.create().show();
}
}