1# 性能优化
最近被安排解决开始菜单启动慢,有些经验这里做一个笔记
1. 首先从进程入手,分析进程是否被杀死。
如果被杀死,解决方案:
Android service后台服务进程的守护:
AndroidManifest.xml
+ <receiver android:name=".KeepReceiver">
+ <intent-filter>
+ <action android:name=
+ "android.intent.action.BOOT_COMPLETED" />
+ </intent-filter>
+ </receiver>
+
+ <service android:name=".KeepService" />
+public class KeepReceiver extends BroadcastReceiver{
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Intent in = new Intent(context, KeepService.class);
+ context.startService(in);
+ }
+}
+public class KeepService extends Service{
+
1. @Override
2. public IBinder onBind(Intent intent) {
3. return null;
4. }
5. 6. @Override
6. public int onStartCommand(Intent intent, int flags, int startId) {
7. return START_STICKY;
8. }
+}
作用: 当进程被杀死后,启动服务,启动进程;
注意:android.intent.action.BOOT_COMPLETED 系统中定义的
2. 充分利用Android Studio分析代码, 优化内存。
- Android Monitor中查看Memory的使用情况:
- 测试Demo: MemoryLeak_Demo
- 当退出再进入, Memory 使用量没有重新开始累积, 表示 – > 存在内存泄漏;
- 解决: 方案
3. 代码分析
列表内容
- Handler – 有时候使用内存对象在需要销毁的时候这个对象因为被其他对象引用而无法销毁,那么这时候这个对象就属于内存泄露了!
- 错误写法
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
dosomething();
}
};
解释: 定义的handler对象其实是一个内部匿名了, 它会隐式的持有外部类的引用. 假设: 隐式持有外部activity的引用, 当销毁activity后, GC不会收回引用, 造成内存泄漏;
正确的写法:
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
dosomething();
}
};