当前位置: 代码迷 >> Android >> service运行时间过久,就不起作用解决思路
  详细解决方案

service运行时间过久,就不起作用解决思路

热度:35   发布时间:2016-05-01 13:00:42.0
service运行时间过久,就不起作用

我在onStartCommand中用一个Timer每隔5秒钟扫描一下相册,有新的照片就copy到其他地方。
请问谁能帮小弟看看哪里有问题啊?
问题不是每次都发生,一般是运行时间比较久之后会发生。
我用下面的代码查看service在运行就是不起作用!
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
  if ("an.an.MyService".equals(service.service.getClassName())) {
  return true;
  }
  }

----------- service

public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
videoBool = intent.getBooleanExtra("video",true);
imageBool = intent.getBooleanExtra("image",false);
final File f1 = new File(dirStr);
initHashTable();
final File f2 = new File(destDirStr);
if(!f2.exists())
{
try
{
destBool = f2.mkdirs();
}catch(Exception e)
{
}
} else {
destBool = true;
}
timer1.schedule(new TimerTask()
{
@Override
public void run() {
if(imageBool)
{
Cursor c = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
null, selectClause, selectArgs, null);
int id=0;
while(c.moveToNext())
{
id = c.getInt(c.getColumnIndex(MediaStore.Images.Media._ID));
if(!imageVec.contains(id))
{
String str1 = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));
String dn = c.getString(c.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
File f1 = new File(str1);
File f2 = new File(destDirStr + dn);
boolean copyB = Utils.copyFile(f1,f2,false);
imageVec.add(id);
Log.i("ccccc",dn);
}
}
}
if(videoBool)
{
Cursor c = getContentResolver().query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
null, selectClause, selectArgs, null);
int id=0;
while(c.moveToNext())
{
id = c.getInt(c.getColumnIndex(MediaStore.Video.Media._ID));
if(!videoVec.contains(id))
{
String str1 = c.getString(c.getColumnIndex(MediaStore.Video.Media.DATA));
String dn = c.getString(c.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
File f1 = new File(str1);
File f2 = new File(destDirStr + dn);
boolean copyB = Utils.copyFile(f1,f2,false);
videoVec.add(id);
Log.i("ccccc",dn);
}
}
}
}
}, 0, 5000);


return super.onStartCommand(intent, flags, startId);
}

------解决方案--------------------
Service如果你没有进行特殊的配置,那么它一般也就能正常执行20秒左右,
你应该起一个独立的线程,如果需要你应该起一个独立的进程来包装你的Service。

以便它能长期运行。
------解决方案--------------------
1.刷新时间不要太频繁
2.AndroidManifest.xml是否添加了不允许休眠的权限
Java code
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DEVICE_POWER" />
------解决方案--------------------
另外你通过广播去调用service的话,如果service被系统干掉了,它还会重新new一个出来。
------解决方案--------------------
以前我也碰到类似问题,可能是系统内存不足导致的杀掉了你这个进程。
  
可以去网上搜搜如何提高你进程的优先级。例如:可以使用Service的方法 ,startForeground()使其变为前台进程。

理论上来说: super.onStartCommand(intent, flags, startId)的返回值为START_STICKY,关于START_STICKY和START_NO_STICKY 的区别你可以看看这篇帖子:http://topic.csdn.net/u/20120213/21/9841319c-4ab8-4830-84d5-da2b2debf35e.html 。验证下。
  相关解决方案