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

背景:

例子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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值