2 joyce qin 1986 Joyce_Qin_1986 于 2013.01.22 13:48 提问

应用在屏幕锁屏后再无响应

最近做一个应用,log一直在打印

GC_CONCURRENT freed 433k,7% free 7975K/8564K,paused 12ms+4ms, total 70ms

类似这样的信息。
这个应用在一直使用的情况下是没有问题的,可是锁屏大概1分钟之后再回来,一种情况是应用直接没有响应了,另一种情况是等很久(大概10秒左右)又能响应,等它能响应回来后,又可以正常工作了。
真是不知道是怎么回事,从log信息看到虽然UI上面没有响应,可是后台的service还在正常工作的。
是内存泄露吗?因为从上面的GC_CONCURRENT看出,我只有7%的内存是free的,还是什么别的原因引起的?
另外还有一个问题,就是我用一个继承Application的类来管理activity的退出,在点击退出按键的时候调用

public void exit() {
    Log.e(TAG, "exit in myapplication");
    for (Activity activity : activityList) {
        Log.e(TAG, activity.getLocalClassName()+ " finish");
        activity.finish();
    }
    System.exit(0);
}

这个函数,可是发现执行finish()方法后activity的onDestroy方法并没有被调用,这是怎么回事啊?

2个回答

loFataMer
loFataMer   2013.01.22 14:54
已采纳

你的应用锁屏后无响应是内存泄漏造成的。

锁屏之后不代表应用退出了,一般在锁屏时将应用设置为后台运行会更好,试试saveInstanceStateonPause

对于android来说一般不鼓励应用退出,这和手机型号也有一些关系。

补充:

重写onSaveInstanceState,(savedInstanceState包),然后设置需要的应用状态参数值。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.

}

包本质上一个存储NVP(属性名-值对应)的方法地图,并且会传递到你提取值的onCreateonRestoreInstanceState

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}

这种方法也可以用到存储应用实例值上面,比如未保存的文本。


看看这个链接:SavingPersistentState

两个方法的文档说明链接:
onCreate

onSaveInstanceState

loFataMer
loFataMer 我补充了一个其他的实例。可以看一下
大约 5 年之前 回复
Joyce_Qin_1986
Joyce_Qin_1986 按键无响应后报的ANR,Reason是keyDispatchingTimeOut
大约 5 年之前 回复
Joyce_Qin_1986
Joyce_Qin_1986 dms的作用是将本地的媒体文件构造进httpserver上面(我用了NanoHttpd),供播放端来下载这些媒体文件
大约 5 年之前 回复
Joyce_Qin_1986
Joyce_Qin_1986 能举个例子吗?我在网上找了很多方法,可是都不凑效。我的应用里面有很多activity和service之间的通信(broadcast),因为我是做DLNA的手机端控制应用的,activity现在媒体列表和控制界面,有一个service一直在后台运行,实现控制功能和dms功能。
大约 5 年之前 回复
Kill_it
Kill_it   2013.01.22 15:54

你不应该管理activity,这是由系统管理的。另外,你也不应该kill程序,这样也是违背开发者习惯的。

所以你的问题源于你坚持管理activity,这样会阻止系统destroy它。android系统和ios等其他系统不同,你不能kill应用,应该有系统自行决定何时kill应用。

可以参看一下google的android开发者Reto Meier的文章:when-to-include-exit-button-in-android

Joyce_Qin_1986
Joyce_Qin_1986 是的,这个问题我已经解决了,现在头疼着内存泄露的问题。谢谢啊
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!