背景:
例子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();
}
}
}
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,前提是没有内存泄漏。