android-Activity路由机制及子页面退出软件方法
刚开始做完第一个应用,开始重构我的代码。没有java编程基础,还是初学,希望各位路过不要见笑。
之前在网上找了很多种完全退出的办法,退后选择把打开Activity添加到全局的List数组中,在要退出的时候,把List中的Activity全部关闭。
1.首先定义一个页面跳转辅助类 IntentHepler 、并在AddRoutingRule()方法中添加我想要的路由规则
public class IntentHepler { //这个类是Activity跳转辅助类 //在AddRoutingRule方法中添加对应的转换规则 //在MyActivity的页面中直接调用IntentTo传入短命名进行页面跳转。 public static HashMap hashmap ; public static void AddRoutingRule(){ hashmap = new HashMap<String,String>(); //com.baiyizf.gdouKnow. 之后的包组合 hashmap.put("About", "About.DefaultActivity"); hashmap.put("LoginJw", "JiaoWu.LoginJwActivity"); } public static void IntentTo (MyActivity myActivity, String ActivityName) throws ClassNotFoundException{ Intent intent = new Intent(); //处理路由规则 ActivityName =Routing(ActivityName); //反射类型 Class<MyActivity> clazz = (Class<MyActivity>) Class.forName(ActivityName); intent.setClass(myActivity,clazz); myActivity.startActivityForResult(intent, 0); } public static String Routing(String ActivityName){ //第一次先初始化hashmap if(null == hashmap){ AddRoutingRule(); } //取对应的路由规则 if(hashmap.containsKey(ActivityName)){ ActivityName = hashmap.get(ActivityName).toString(); } //组类命名空间进行组合。加入包的前面部分 ActivityName = "com.baiyizf.gdouKnow." + ActivityName; return ActivityName; } }
下面是我的项目目录,比如我要跳转到About文件夹的Default页面,调用IntentTo方法传入ActivityName为"About"就实现跳转。
比如我从当前的Activity跳转到About页面。可以这样调用
IntentHepler.IntentTo(this,"About");
当然还可以变得更简单些,通过继承Activity就是下面要说到的内容。
2、定义一个StaticObject类,存储全局静态变量。这里我暂时只放一个Activity的List数组。
public class StaticObject { private static List<MyActivity> myActivityList ; public static void AddMyActivity(MyActivity myActivity){ if(null == myActivityList){ myActivityList = new ArrayList<MyActivity>(); } if(!myActivityList.contains(myActivity)){ myActivityList.add(myActivity); } } public static void ReMoveMyActivity(MyActivity myActivity){ if(null == myActivityList){ return; } if(myActivityList.contains(myActivity)){ myActivityList.remove(myActivity); } } public static List<MyActivity> GetMyActivityList(){ return myActivityList; } }
这里对应list有三个方法。分别是添加,移除,还有返回整个数组。
3、接下来定义MyActivity类继承Activity,然后其它页面继承Activity。在里面可以写每个页面都重复的代码,像添加Activity对象到List,toast,页面跳转,退出软件,handle,文件存储等。
public class MyActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub //添加当前activity到list数组 StaticObject.AddMyActivity(this); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { // TODO Auto-generated method stub //把当前activity从list数组移除 StaticObject.ReMoveMyActivity(this); super.onDestroy(); } // finish全部打开的Activity实现退出 protected void finishAll () { for(MyActivity myActivity:StaticObject.GetMyActivityList()){ myActivity.finish(); } } //跳转到Activity //参数ActivityName可以是短规则名 protected void intentToActivity(String ActivityName){ try{ IntentHepler.IntentTo(this,ActivityName); } catch(ClassNotFoundException e){ Log.v("IntentError", "不存在该Activity:"+ActivityName); } } public void displayToast(String str) { Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); } //添加异步调用方法 //handle回调方法 //文件存储 //菜单 }
4、 下面就看一下它给我带来的效果
在MainActivity 跳转到LoginJwActivity页面
public class MainActivity extends MyActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentToActivity("LoginJw"); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
然后在LoginJwActivity 中退出软件
public class LoginJwActivity extends MyActivity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.jw_activity_login); // displayToast("loginJw"); Log.v("jwlogin", "loginjw"); SystemClock.sleep(6000); finishAll(); //intentToActivity("About"); } }
源码:下载地址。
欢迎大家回复指正。