【モバイル開発】Androidアプリを完全終了


この間、試合に参加してプロジェクトをしていたとき、Androidでアプリケーションがポップアップしてダイアログボックスを終了してアプリケーションを終了すると、いつも前のActivityが現れて、Activityがジャンプしている間にfinish()を落としてしまい、結局だめになりました!その原因を探します:もとはプロジェクトの中で多くのActivityがインタフェースを表示するために使って、间はまたデータの情报の交流を混ぜて、私达はActivityがスタックの方式で保存することを知っていて、プログラムを退出したいならば、自然と多くのActivityを破壊しなければなりません!
後でネットで調べて、解決方法を見つけて、ここで先輩たちの知識を総括して、それをもっと系統化させます!
1.タスクマネージャメソッド(Activity Manager):
まず、この方法は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メソッドごとにActivityをMyApplicationオブジェクトインスタンスコンテナに追加する
MyApplication.getInstance().addActivity(this);

C.すべてのActivityを終了する必要がある場合にexitメソッドを呼び出す
MyApplication.getInstance().exit();

4.放送方式:
A.MyActivityクラス説明:Activityのサブクラスで、ベースクラスのサブクラスは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はすべてMyActivityを継承し、プログラムを終了する必要があるときに放送を送信する
Intent intent = new Intent(context.getPackageName()+".ExitListenerReceiver");
context.sendBroadcast(intent);

できます.
5.テクニック:
A.まず共通のclassを設定する.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.異常によりアプリケーションのサブクラスに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());
    }
}

注意:アプリケーションの登録を忘れないでください
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
あまり使わないので、参考にしてみてくださいね~