步骤一:搞Application类的成员变量作为list,记录开过的activity
public class MyApplication extends Application{
//运用list来保存们每一个activity是关键
private List mList = new LinkedList();
//为了实现每次使用该类时不创建新的对象而创建的静态对象
// add Activity
public void addActivity(Activity activity) {
mList.add(activity);
}
public void removeActivity(Activity activity) {
mList.remove(activity);
}
//关闭每一个list内的activity
public void exit() {
try {
for (Activity activity:mList) {
if (activity != null)
activity.finish();
}
} catch (Exception e) {
e.printStackTrace();
}
// finally {
// System.exit(0);
// } //这个不用也没关系,不过具体没经测试人员搞过,不清楚
}
//杀进程
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
}
Application使用的细节:
1)网上找的例子,会对Application单例化,以保证list的唯一(丫的我照着单例还报错了),其实没必要,Application类是个特别的类,该类下的变量本来就是可以给该应用下的所有activity用作全局变量的;app创建后,系统就会实例化出一个唯一的Application对象,犯不着自己还搞一个单例化模式去搞Application实例。
2)注意在清单里注册,补充name属性
步骤二:每个activity的onCreate()里
加一句:((MyApplication) getApplication()).addActivity(this);
此外,在onDestroy()里,加一句:((MyApplication) getApplication()).removeActivity(this);
下一步,笔者试试写基类,把这两行代码深入activity心
步骤三:baseActivity
假如每个activity都要写上面两行代码,那是不科学的
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApplication) getApplication()).addActivity(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
((MyApplication) getApplication()).removeActivity(this);
}
}
只需要写上面的baseActivity,然后继承它就好了
关于baseActivity里的this,下面补充java知识:
要说super就先要说this。
"this",作为一个特殊的关键字,它的规则如下:
1。可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。
2。可以在一个类的非static成员内部使用,表示当前这个对象。此时,this就是一个final的普通变量,它有静态类型,就是这个类C本身;它有动态类型,就是当前这个对象的类型。你可以对它调用成员函数,把它传递给别的函数,等等等等。只要一个C类型的final变量可以出现的地方,它就可以出现。
"super"。它和"this"类似,但是也有不同的地方。
1。表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。
2。可以在一个类的非static成员内部使用。比如super.method()。
但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。
为什么不是?因为如果是就坏了。java里面有一个金科玉律:任何public非static函数的调用都是多态的。
所以,如果super是个变量,也指向当前对象,那么,不管super的静态类型是什么super.method()必然调用的是子类的那个版本,而不会是我们期望的,静态地选择父类的那个版本。
所以,你只要把super.xxx看成一个特殊的语法,比如理解为“super::xxx”就好了。
既然super不是一个变量,那么不能把它象一个普通变量那样"==",或者传递给某个函数就看起来很正常了,是么?何况,你其实也用不着它,有this你这些要求就都可以办到了。
3。super的另外一个作用是调用父类的protected函数。只有通过"super"这个魔咒,我们才能操作父类的protected成员,别无它法。
总结:this代表的是当前对象,子activity继承了baseactivity,那么执行super.oncreate()的那个this就是这个子activity了;要理解这句简单的话,其实就是要明白,super.xx()里的这个super绝对不是父类的对象的意思。你就当成一个标志来理解