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(); } }}
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
- Android如何使用已调用多个Activity的Application
- android 面试4: 如何退出Activity?如何安全退出已调用多个Activity的Application?
- Android面试题-如何退出Activity?如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- 如何安全退出已调用多个Activity的Application?
- JAVA中继承与初始化顺序
- Maven项目引入JS,css等文件的问题
- linux 中特殊符号用法
- suse11下关闭防火墙
- 使用Callable和Future创建线程
- Android如何使用已调用多个Activity的Application
- 单源最短路径问题--Dijkstra
- Error:Execution failed for task ':app:javaPreCompileDebug'. > Annotation processors must be explicit
- AttributeError: /usr/lib/x86_64-Linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup
- 657. Judge Route Circle
- 电路实验
- 解读Oracle12.2体系架构:Filesystem与Multitenant
- 考研经验贴——看了都上了
- 在CentOS环境下mysql如何远程连接