android中的static

本文深入探讨Android应用中静态变量的生命周期,解释为何在窗口销毁后静态变量仍能保留,并通过实践演示如何手动释放相关资源。重点分析了静态变量的全局作用域、内存管理机制及线程生命周期之间的相互影响。


public class MainActivity extends Activity {
    private static boolean Flag = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("gg", "Flag:" + Flag);
        Flag = true;
    }
}
程序第一次运行,打印信息为false,之后退出程序,再次运行,打印信息为true。
当程序退出的时候,定义的Flag不会被销毁么?为什么还会保留下来?
什么时候才能销毁static变量呢?


在DDMS中查看,会发现推出了Activity,但是线程列表中依然有这个线程。
我试了一下,重写了onDestory,在onDestory里添加android.os.Process.killProcess(android.os.Process.myPid());把线程干掉,再次调用就正常了。
也就是说线程没有销毁,那么资源就没有释放。


当窗口消毁时,Activity的静态变量是存在的,因为静态变量是属全局变量、静态变量是整个应用程序的公共变量(即使你这个地方写的是私有),所以Activity消毁时,静态变量是不会清除的。但当什么时候才会清除呢,上面说过静态变量是整个应用程序的,所以只有当各个应用程序的进程消毁时,静态变量才会毁,所以当LZ调用android.os.Process.killProcess(android.os.Process.myPid());就正常了。


### Android 开发中 `static` 关键字的使用场景及注意事项 #### 一、静态变量 在 Android 开发中,`static` 可以用来定义属于类本身的成员变量而非某个特定对象的属性。这种设计模式通常用于共享数据或状态。例如,在整个应用生命周期内保持某些配置参数不变时,可以将其声明为静态变量。 需要注意的是,虽然可以通过这种方式存储全局访问的数据,但由于内存管理机制的原因,如果这些数据占用大量空间或者持有上下文引用,则可能引发内存泄漏问题[^1]。因此建议谨慎对待涉及 Context 的任何静态字段设置。 ```java public class AppConfig { public static String APP_NAME = "MyApp"; } ``` #### 二、静态方法 对于那些不需要操作实例成员的方法来说,标记成 static 是一种良好实践。这类函数独立于具体的对象存在,仅需通过类名即可调用。这不仅提高了程序运行效率——因为无需创建额外的对象副本就能完成任务;同时也增强了代码清晰度与逻辑结构化程度[^2]。 比如下面这个例子展示了如何利用静态工厂模式替代传统的构造器: ```java public class UserFactory { private UserFactory() {} // 私有化构造防止外部new public static User createUser(String name, int age){ return new User(name,age); } } // 调用方式如下: User user = UserFactory.createUser("Tom",28); ``` #### 三、静态内部类 当一个辅助类别完全服务于另一个主要类别,并且它本身并不需要维持对外界环境的认知(即不依赖外围类的具体实例),那么就可以考虑采用静态嵌套形式来组织两者关系。这样做的好处在于减少不必要的耦合同时还能享受编译期优化带来的性能提升。 此外值得注意的一点是关于加载顺序方面:只有当首次主动请求获取Static Nested Class的信息时才会触发它的初始化过程,而不会仅仅因为触碰到了外层容器就同步启动子组件的相关准备工作[^3]。 ```java public class OuterClass { public static class StaticNestedClass{ ... } // 非静态版本则必须依附于OuterClass 实例才能被实例化 public class InnerClass{...} } ``` #### 四、结合Handler避免内存泄露 考虑到Android平台特殊的线程模型以及UI更新需求,开发者经常需要用到 Handler 来安排异步任务执行计划表单。然而如果不恰当地保留了对 Activity 或 Fragment 等短命实体的强引用作为回调目标的话,即使该界面已经销毁也可能因仍有待处理的消息挂载在线路上而导致无法及时回收资源从而造成浪费甚至崩溃现象发生[^4]。 为了避免上述情况出现,推荐做法是在适当时候清理掉不再使用的Message/CALLBACKS列表项内容: ```java @Override protected void onDestroy(){ super.onDestroy(); handler.removeCallbacksAndMessages(null); } ``` --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值