您好,登錄后才能下訂單哦!
前段期間,參加比賽做項目時遇到了一個問題:Android中應用程序彈出退出對話框退出應用程序時,老是出現上一個Activity,于是將在Activity跳轉時將其finish()掉,結果還是不行!尋其原因:原來項目中有好多Activity用來顯示界面,之間還摻扎著數據信息的交流,我們知道Activity是以棧的方式存放,要想將程序退出,自然得將眾多Activity銷毀掉了!
后來在網上查閱了一下,找到了解決方法,在此總結一下前輩們知識,使其更加系統化!
1.任務管理器方法(ActivityManager):
首先要說明該方法運行在Android 1.5 API Level為3以上才可以,同時需要權限
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName());
系統會將,該包下的 ,所有進程,服務,全部殺掉,就可以殺干凈了,要注意加上
<uses-permission android:name=\"android.permission.RESTART_PACKAGES\"></uses-permission>
2.Dalvik VM的本地方法:
android.os.Process.killProcess(android.os.Process.myPid()) //獲取PID System.exit(0); //常規java、c#的標準退出法,返回值為0代表正常退出
3.一種比較流行的Android經典完美退出方法:
使用單例模式創建一個Activity管理對象,該對象中有一個Activity容器(具體實現自己處理,使用LinkedList等)專門負責存儲新開啟的每一個Activity,并且容易理解、易于操作,非常不錯!
A.MyApplication類(儲存每一個Activity,并實現關閉所有Activity的操作)
public class MyApplication extends Application { //對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList實現了基于動態數組的數據結構,要移動數據。LinkedList基于鏈表的數據結構,便于增加刪除 private List<Activity> activityList = new LinkedList<Activity>(); private static MyApplication instance; private MyApplication(){ } //單例模式中獲取唯一的MyApplication實例 public static MyApplication getInstance() { if(null == instance) { instance = new MyApplication(); } return instance; } //添加Activity到容器中 public void addActivity(Activity activity) { activityList.add(activity); } //遍歷所有Activity并finish public void exit(){ for(Activity activity:activityList) { activity.finish(); } System.exit(0); } }
B.在每一個Activity中的onCreate方法里添加該Activity到MyApplication對象實例容器中
MyApplication.getInstance().addActivity(this);
C.在需要結束所有Activity的時候調用exit方法
MyApplication.getInstance().exit();
4.廣播方式:
A. MyAcitivty類說明:Acitivty的子類,基礎該類的子類必須實現onCreate 方法,在該類中注冊了一個BroadcastReceiver 用于接收退出消息,在接收到消息之后結束自身
public abstract class MyAcitivty extends Activity { /**負責各個具體 Activity 的顯示**/ public abstract void onCreate(); @Override public void onCreate(final Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); onCreate(); RegListener(); } /**注冊退出事件監聽**/ public void RegListener() { ExitListenerReceiver exitre = new ExitListenerReceiver(); IntentFilter intentfilter = new IntentFilter(); intentfilter.addAction(this.getPackageName() + "." + "ExitListenerReceiver"); this.registerReceiver(exitre, intentfilter); } class ExitListenerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent i) { ((Activity) context).finish(); } } }
B.自己的Activity都繼承MyAcitivty,到需要退出程序的時候發送廣播
Intent intent = new Intent(context.getPackageName()+".ExitListenerReceiver"); context.sendBroadcast(intent);
即可。
5.一個技巧方式:
A.首先設定一個公用的class: Setting.java,定義一個靜態類成員
public boolean static isCloseAll=false;
B.然后,在每一個Activity的onResume()加入這一個:
@Override onResume() { super.onResume(); if(Setting.isCloseAll) finish(); }
C.當最后一個Activity需要結束整個程序便執行:
Setting.isCloseAll=true; finish();
6.捕獲空指針異常
A.通過異常并在Application的子類中重新注冊Thread的 Thread.UncaughtExceptionHandler接口:
package com.example.android_uncatchexception; import android.app.Application; public class MyCrashApplication extends Application { @Override public void onCreate() { super.onCreate(); //程序一啟動,就將未捕獲異常初始化 CrashHandler.getInstance().init(getApplicationContext()); } }
注:記得注冊Application
B.自定義異常捕獲類:
package com.example.android_uncatchexception; import java.lang.Thread.UncaughtExceptionHandler; import android.content.Context; import android.util.Log; /** * 自定義異常捕獲類 * * @author ZHF */ public class CrashHandler implements UncaughtExceptionHandler { public static final String TAG = "CrashHandler"; // 程序的Context對象 private Context mContext; /** 單例模式 **/ private CrashHandler() { } /** 懶漢式 **/ private static class CrashHolder { static final CrashHandler crashHandler = new CrashHandler(); } public static CrashHandler getInstance() { return CrashHolder.crashHandler; } public void init(Context context) { mContext = context; // 設置該CrashHandler為程序的默認處理器 Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { Log.d(TAG, "uncaughtException--->thread" + thread + " name: " + thread.getName() + " id: " + thread.getId() + "exception--->" + ex); String threadName = thread.getName(); if("main".equals(threadName)) { Log.d(TAG, "在主線程的崩潰!"); }else { //這里我們根據thread name來進行區別對待:可以將異常信息寫入文件供以后分析 Log.d(TAG, "在子線程中崩潰!"); } android.os.Process.killProcess(android.os.Process.myPid()); //殺死該進程 System.exit(0); //退出 } }
C.在要退出的地方制造空指針異常即可實現閃退,并且不會彈出ANR對話框
package com.example.android_uncatchexception; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button mBtn; String str; //不要初始化,為了下面制造空指針異常 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn = (Button) this.findViewById(R.id.button1); mBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //NullPointerException System.out.println(str); } }); } }
7.網上還有一些其他方式:
A.restartPackage、
B. killBackgroundProcesses
不常用,大家可以自行參考哦~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。