Androidは、複数のActivityが呼び出されたアプリケーションをどのように使用するか

9779 ワード

背景:
例1:あるソフトウェアが反対側に登録されている場合、現在のログインはXXX時間XXにログインするようユーザーに要求し、現在のインタフェースは破棄され(前の開いたインタフェースも破棄される)、最後にログインインタフェースにジャンプする.
例2:インタラクションでは、多くのインタフェースを開くかもしれませんが、今トップページに戻るときは、1つずつ返さなければなりません.このとき、インタラクションをより友好的にするために、直接トップページに戻る機能が加わり、前の開いたページは正常に退けなければなりません.
例3:登録プロセスでは、Aインタフェース(トップページ面)で登録をクリックし、B,C,Dインタフェースで登録が完了すると、B,C,Dは破壊されますが、Dに登録が成功しない場合(Aインタフェースに戻らない場合)は、B,C,Dは破壊されません.
この場合,Activityを安全に終了する方法を考える必要がある.
具体的な方案:
1.開いているActivityを記録し、終了が必要な場合は閉じるactivityを閉じる
2.特定の放送を送信し、放送のactivityを受信して閉じる
3.intentのflagにより実現する、intentを実現する.setFlags(Intent.FLAG_ACTIVTY_TOP)は、新しいactivityをアクティブにします.タスクスタックにactivityがすでに存在する場合、システムはこのactivityの上のすべてのActivityを破棄します.
ここでは主に第1の案を紹介します.
手順:
1.アプリケーションを作成し、すべてのactivityセットを管理するためのリストを作成し、リストの追加と破棄を担当する
public class MyApplication extends Application {
    //    activity   
    List ActivityList = new ArrayList<>();
    //     activity
    public BaseActivity LastBaseActivity;

    //    activity   
    public void addActivity(BaseActivity activity){
        if(!ActivityList.contains(activity)){
            ActivityList.add(activity);
        }
    }
    //    activity   
    public void removeActivity(BaseActivity activity){
        if(ActivityList.contains((activity))){
            ActivityList.remove(activity);
        }

    }
    //       activity   
    public void clearALLActivity(){
        LastBaseActivity = ActivityList.get(ActivityList.size()-1);
        for(int i = 0;i

2.ベースクラスとしてBaseActivityを確立し、サブクラスが継承されると、activityが追加されるたびにリストに追加されます.
public abstract  class BaseActivity extends AppCompatActivity {
   public MyApplication myApplication;
    //         activity
    public interface  exitlastListener{
        void exitlast();
    }
    private exitlastListener mexitlastListener;
    public void setexitlastListener(exitlastListener mexitlastListener){
      this.mexitlastListener = mexitlastListener;

    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        initContentView(savedInstanceState);
        myApplication = (MyApplication)this.getApplication();
        //     activity     activity
        myApplication.addActivity(this);



    }
    //   j  
    protected  abstract  void initContentView(Bundle savedInstanceState);

    @Override
    protected void onDestroy(){
        super.onDestroy();
        myApplication.removeActivity(this);
        if(myApplication.LastBaseActivity == this){
            mexitlastListener.exitlast();

        }
    }

    //  activity
    protected String getActivitynumber(Activity context){
        ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE) ;
        List runningTaskInfos = manager.getRunningTasks(1) ;
        if(runningTaskInfos != null){
            return " Activity " +runningTaskInfos.get(0).numActivities;

        }else{
            return null;
        }
    }


}

3.MainActivityの実装:
public class MainActivity extends BaseActivity {
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LogManager.Log(TAG+"--onCreate");
        TextView text_main = (TextView)findViewById(R.id.text_main);
        text_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,FirstActivity.class));
            }
        });
    }

    @Override
    protected void initContentView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
            //       ,activity onStop,     
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addCategory(Intent.CATEGORY_HOME);
            startActivity(intent);
            Toast.makeText(MainActivity.this,"1111",Toast.LENGTH_SHORT).show();
            return false;

        }else{
            Toast.makeText(MainActivity.this,"2222",Toast.LENGTH_SHORT).show();
          //  return true;
            return super.onKeyDown(keyCode, event);
        }
    }

    @Override
    protected void onResume(){
        super.onResume();
        LogManager.Log(TAG+"--onResume");

    }

    @Override
    protected void onStart(){
        super.onStart();
        LogManager.Log(TAG+"--onStart");
    }

    @Override
    protected void onPause(){
        super.onPause();
        LogManager.Log(TAG+"--onPause");
    }

    @Override
    protected void onStop(){
        super.onStop();
        LogManager.Log(TAG+"--onStop");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        LogManager.Log(TAG+"--onDestroy");
    }
}
4.FirstActivityインタフェース:
public class FirstActivity extends BaseActivity {

    private String TAG = "FirstActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        LogManager.Log(TAG+"--onCreate");
        TextView text_first = (TextView)findViewById(R.id.text_first);
        text_first.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(FirstActivity.this,SecondActivity.class));
            }
        });
    }
    @Override
    protected void onStart(){
        super.onStart();
        LogManager.Log(TAG+"--onStart");
    }

    @Override
    protected void onResume(){
        super.onResume();
        LogManager.Log(TAG+"--onResume");
    }
    @Override
    protected void onPause(){
        super.onPause();
        LogManager.Log(TAG+"--onPause");
    }

    @Override
    protected void onStop(){
        super.onStop();
        LogManager.Log(TAG+"--onStop");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        LogManager.Log(TAG+"--onDestroy");
    }

    @Override
    protected void initContentView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_first);
    }
}

5.SecondActivityインタフェース:go_mainは最初のインタフェースに戻ります
public class SecondActivity extends BaseActivity {
    private String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        LogManager.Log(TAG+"--onCreate");
        Log.d("debug  ",getActivitynumber(SecondActivity.this));
        TextView text_gomain = (TextView)findViewById(R.id.text_gomain);
        TextView text_exit = (TextView)findViewById(R.id.text_exit);
        text_gomain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivity(new Intent(SecondActivity.this,FirstActivity.class));
                Log.d("debug  ",getActivitynumber(SecondActivity.this));
                myApplication.topActivity();
            }
        });
        text_exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });


    }

    @Override
    protected void onStart(){
        super.onStart();
        LogManager.Log(TAG+"--onStart");
    }

    @Override
    protected  void onResume(){
        super.onResume();
        LogManager.Log(TAG +"--onResume");
    }

    @Override
    protected void onPause(){
        super.onPause();
        LogManager.Log(TAG+"--onPause");
    }

    @Override
    protected void onStop(){
        super.onStop();
        LogManager.Log(TAG+"--onStop");
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        LogManager.Log(TAG+"--onDestroy");
    }


    @Override
    protected void initContentView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_second);

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
//        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
//            //    
//            myApplication.clearALLActivity();
//            setexitlastListener(new exitlastListener() {
//                @Override
//                public void exitlast() {
//                    //      2
//                    android.os.Process.killProcess(android.os.Process.myPid());
//                }
//            });
//
////            Intent intent = new Intent(getApplicationContext(),MainActivity.class);
////            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//  activity ,     activity,           
////            startActivity(intent);
//            return true;
//        } else {
//            return super.onKeyDown(keyCode, event);
//        }
        return super.onKeyDown(keyCode, event);
    }
}

特にactivityを手動で管理する必要はありません.destroyを実行するとactivityが回収されるので、メモリの漏洩がないことを前提としています.