Android如何使用已调用多个Activity的Application

来源:互联网 发布:知乎 平面设计提高 编辑:程序博客网 时间:2024/05/16 07:14

背景:

例子1:当一个软件如果在另一端登录了,那么当前登录就会弹出提示用户在XXX时间XX地方登陆,当前界面会销毁(之前的打开的界面也会销毁),最后会跳转到登录界面。
例子2:在交互中,也许会打开很多个界面,但如果现在要返回到首页的时候,就必须一个个返回回去,这时候为了使交互更友好,会加入直接返回首页的功能,之前的打开的页面就必须正常退出。
例子3:在注册流程中,在A界面(首页面)点击注册,通过B,C,D界面完成注册后,B,C,D就要摧毁,但是如果D中注册不成功的时候(没有返回到A界面),B,C,D就不能摧毁。
这时候就需要考虑如何进行安全退出Activty的问题。
具体方案:
1.记录打开的Activity,在需要退出的时候,关闭要关闭的activity
2.发送特定的广播,收到广播的activity后关闭
3.通过intent的flag来实现,实现intent.setFlags(Intent.FLAG_ACTIVTY_TOP)激活一个新的activity。因为如果该任务栈已经有该activity,系统会把这个activity上面的所有Activity销毁掉。

这里主要介绍第一种方案:
步骤:
1.建立一个Application,建立一个List来管理所有activity集合,List负责增加和销毁

public class MyApplication extends Application {    //管理所有activity的集合    List<BaseActivity> 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<ActivityList.size();i++){            BaseActivity mbaseActivity = (BaseActivity)ActivityList.get(i);            mbaseActivity.finish();        }        ActivityList.clear();    }    //清除除了顶部以外的activity    public void topActivity(){        LastBaseActivity = ActivityList.get(ActivityList.size()-1);        for(int i = 0;i<ActivityList.size()-1;i++){            BaseActivity mbaseActivity = (BaseActivity)ActivityList.get(i);            mbaseActivity.finish();        }    }}

2.建立一个BaseActivty作为基类,当子类去继承,然后每添加一个activity加进到List。
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<ActivityManager.RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1) ;        if(runningTaskInfos != null){            return "总Activity数" +runningTaskInfos.get(0).numActivities;        }else{            return null;        }    }}


3.MainActivty的实现:
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,前提是没有内存泄漏。

阅读全文
0 0
原创粉丝点击